webサーバーをローカルリポジトリにする

とあるサイトで、webサーバーにリポジトリを置いて、バージョン管理ツールからリポジトリをプルすることでサイトを更新する方法に切り替えました。

はじめ「webサーバーをローカルリポジトリにする」と聞きました。
リモート環境のサーバにあるリポジトリなのに“ローカルリポジトリ”というのか疑問でした。

イメージはこんな感じです。

f:id:yokoyoko_115:20220219013133j:plain

ローカルリポジトリとは

ローカルリポジトリとは、Gitなどの分散バージョン管理システムで、利用者の手元のコンピュータに作成・複製されたリポジトリ。利用者が直にファイルの編集などを行うことができる。

ローカルリポジトリ(local repository)とは - IT用語辞典 e-Words

他にも、

ユーザーがローカルマシン上で作業するために利用するリポジトリです。

や、  

操作しているデバイスの中にあるリポジトリをローカルリポジトリと呼ぶ

とありました。

うーん、グレー!
ここまではっきりしないこともあるのでしょうか。
そもそもこのWebサーバにリポジトリを置く方法はあまり主流ではないのでしょうか。

***

とにもかくにも、これからは実際のサイトのファイルが置かれているwebサーバーにリポジトリがあるという初めての感覚です。
webサーバーといえど、手順はローカル環境に作ったリポジトリと同じと考え、リモートリポジトリをクローンする方法を調べて実践してみました。
☆ちなみにサイトにはWordPressが入っています。

1.コマンドラインsshでサーバに接続する

参考にした記事です。

Linuxコマンド【 ssh 】リモートマシンにSSHでログイン - Linux入門 - Webkaru

コマンドライン

ssh [ユーザー名]@[ホスト名]

と入れました。
パスワードを聞かれたので、FTPで接続しているときのパスワードを入れるとログインできました。

このパスワードは、プロトコルの種類に関わらず、共通のパスワードなのですね。

2.ディレクトリを圧縮する

失敗してももとに戻せるようにバックアップを用意します。

そのままFTPで落とすには容量もファイル数も多すぎるので圧縮します。

形式は .tar.gzがよいそうです。

[tar コマンド] 大量のファイルを サーバー上で圧縮・解凍する方法 - WEBサイト制作のメモ書き

FTPでダウンロードしておきました。一安心。 sshでする方法もあるのでしょうか。

3.ディレクトリ以下を削除する

ここはコマンドで削除します。

ファイル・ディレクトリを削除するrmコマンドについて詳しく!【Linuxコマンド集】

rmdir(remove directoryの略)コマンドではうまくいきませんでした。

rmdir コマンドはディレクトリの削除で使いますが、中身を空にしてからでないと削除できないそうです。
なかなか限定的ですね。
(後から -r オプションでディレクトリが消えることを知りました)

そこでrmコマンドを使いました。

rm -fr *

オプションのf(強制的に:「削除してもいいですか」の確認やエラーメッセージが出てこない)、r再帰的に:ディレクトリも削除対象になる)をつけると便利です。

*ワイルドカードで、「何らかの文字」という意味なので、全てのファイルやディレクトリが対象になります。

これでごっそり消えたのですが、なぜか rm: No match. と出たり、.htaccessだけ残っていたり、いくつかファイルが残りました。
.htaccessが残っていたのは、パーミッションの問題??)

4.リモートリポジトリからクローンする

サーバーにgitはすでにインストールされているので以下のコマンドでクローンします。

git clone [リモートリポジトリのURL]

はじめSSHでやってみようとしましたが認証でうまくいきませんでした。

The authenticity of host 'ホスト名' can't be established.
RSA key fingerprint is [公開鍵暗号].
No matching host key fingerprint found in DNS.

と出てきました。

公開鍵とかさっぱり分からないのでSSHは断念し、HTTPSでできました。

5.避難させていたファイルを戻す

避難させておいたWordPressのuploadsディレクトリを戻します。

2.で圧縮してダウンロードしておいたtar.gzファイルをFTPで上げ直して、サーバーで解凍します。

解凍は
tar -zxvf [ファイル名].tar.gz です。

6.developブランチからプルする

クローンはおそらくデフォルトのmasterから行われました。
本当はdevelopブランチのものを反映させたいのでdevelopブランチからプルします。

git pull コマンドの使い方と、主要オプションまとめ | WWWクリエイターズ

プルなら git pull origin develop で済むはずです。

ここでは練習も兼ねてフェッチ + マージ(=プル)をします。

フェッチ

git fetch [リポジトリ名] [ブランチ名]

なので git fetch origin develop です。

From [リポジトリのURL] * branch develop -> FETCH_HEAD

マージ

フェッチによって、以前も調べた「リモートトラッキングブランチ(origin/master)」またの名を「リモート追跡ブランチ」ができました。
(2回目以降はリモート追跡ブランチが更新されます)

このブランチをローカルの現在のブランチとマージさせます。

git merge FETCH_HEAD

うまくいかなかったこと

1.〜6.の方法で概ねうまくいきましたが、ちょっとしたミスやどうにもうまくいかなかったことがあり、すんなりとはいきませんでした。

ファイル名が文字化けしてしまう

そのうちの一つは日本語ファイルの文字化けです。

日本語ファイルの画像を投稿でメディアにアップロードして表示させるだけでは問題ありませんが、uploadsディレクトリを圧縮・解凍で移動させたりすると、文字化けするみたいですね。

ここまで気を配れませんでした。盲点。
やはり日本語ファイルは良くないですね。

参考

Git のフックを利用したデプロイの方法 | ソフトウェア雑記

.gitignoreから外したファイルが消えてしまう

もう一つは.gitignore関連です。
git管理後のファイル・ディレクトリを.gitignoreから外しても管理からは外れません。

$ git rm --cached [削除したいファイル]

これでファイルを残したまま管理対象から外すことができるそうですが、ファイルが消えてしまったり、なぜかうまくいかないことがありました。

ローカルリポジトリ(この場合は自分のPC)にファイルは残るがGit管理から外れる、ということであれば、ローカルリポジトリからは消えてしまうということなのかもしれません。

なんかそんな気がしてきました。

地味にこの問題がたびたび起こることがあるので、いつか解決したいと思います。

さいごに

これまではローカルリポジトリに変更のあったファイルを、FTPでアップロードしてサイトを更新していました。
これが良くなかったのですね...場合によってはSFTPでもないという...。

SSHや踏み台サーバーなど、よく分かっていない方法もまだあるので、サイトの更新に安全な方法を学んでいきたいです!

おしまい。