github のリポジトリとサーバーを接続できるようにして、github にあるデータをgit pull
コマンドでサーバーにデプロイするまでの流れを紹介します。
すでにサーバーにファイルがあり、そちらを git 管理に変更する方法の一例です。
サーバーへログイン、ユーザーの切り替え
ssh でサーバーにログインします。
ログインしたユーザーがウェブユーザー(apache や www-data、自分で作ったウェブユーザーなど)であれば、切り替える必要はありませんが、そうでない場合はウェブユーザーに切り替えます。
(例1) ログイン可能ユーザー
ウェブ実行ユーザーがログイン可能なら、ログインしておきます。
sudo su - <ユーザー名>
(例2) www-data のようなログイン不可ユーザー
debian の apache2 はデフォルトのウェブユーザーが www-data で す。しかしこのユーザーにはログインすることができません。そのため、「特定のユーザーでコマンドを実行する」必要があります。
sudo -u <ユーザー名> <コマンド>
このログイン不可ユーザーを使うなら、ここは飛ばして次へ進みます。
鍵の作成
ここでは id_rsa (デフォルト名)で鍵を作ったとして進めます。すでに鍵がある場合は、そちらを使うか別の名前で鍵を作成します。
ログイン可能ユーザーの場合
ユーザーを切り替えたら、ssh-keygen
で鍵を作ります。
cd ~/.ssh
ssh-keygen -t rsa -b 4096
.ssh
ディレクトリがユーザーのホームディレクトリ(/home/{user}
)にないなら作成します。その際のパーミッションは 700 にしておきます。
ログイン不可ユーザーの場合
debian の www-data を例として進めます。このユーザーのホームディレクトリは/var/www/
となるため、この場所に鍵を作ります。
# 鍵を置くところを作る
sudo mkdir /var/www/.ssh
# 所有者をウェブユ ーザに変更
sudo chown www-data:www-data /var/www/.ssh
# パーミッションを変更
sudo chmod 700 /var/www/.ssh
# 鍵作成
sudo -u www-data ssh-keygen -t rsa -b 4096
公開鍵を Github に登録
github のリポジトリへアクセスし、作成した公開鍵(id_rsa.pub
)をSettings -> Deploy Keys
にコピペして登録します。
cat
コマンドで中身を確認してコピーします。
# ログイン可能ユーザー
cat ~/.ssh/id_rsa.pub
# ログイン不可ユーザー
sudo cat <.sshディレクトリのある場所>/.ssh/id_rsa.pub
www-data
なら、/var/www/.ssh/id_rsa.pub
にある(はず)
Git の初期化と設定
鍵を登録したら、github からデータを pull するための準備をします。以下のような流れです。
- 鍵を生成したユーザーにスイッチ(※)
- Git 初期化
- pull したくないファイルの設定
- upstream の設定など
(※)ログイン不可ユーザーの場合は、ログインユーザーではないため sudo su で切り替えることができません。sudo -u <ユーザー名> <コマンド>
の形にして下記のコマンドを実行します。
※念のため、バックアップを取ってから行うことをお勧めします。
(1)Git 初期化
これはおそらくドキュメントルートなどになるはず。
cd <Git管理に変更したいディレクトリ>
# 初期化
git init
(2)pull させないファイルの設定
ここでエディタを起動させて、sparse-checkout の設定を行います。
sparse-checkout では、Git 管理しているファイルで pull したくないもの(README.md)などを設定します。
# sparsecheckout 有効化
git config core.sparsecheckout true
# 設定
vi .git/info/sparse-checkout
設定の例
まず最初に全てのファイルを許可/*
したのち、!ファイル名
で pull したくないものを追加していきます。以下はなんとなくの例です。
/*
!.gitignore
!PULL_REQUEST_TEMPLATE.md
!README.md
!_src/
終わったら :wq もしくは ZZ で保存
(3)リポジトリの設定、取得
準備ができたので、pull してみます。https ではなく git プロトコルの方を登録します。
# 登録
git remote add origin <gitのリポジトリ>
# pull
git pull origin master
# upstream の設定
git branch --set-upstream-to=origin/master master
# pull
git pull
ですが、git で管理しているファイルがすでに存在していると思うので、そちらは全て削除してから pull を行います(これについてはもっといい方法があるかも…)。
以上で Git 化については終わりです。更新のたびにコマンドを入力する必要がありますが、CircleCI などを使ってこのあたりも自動化したら良いのかもしれません。
うまく行かない時
.ssh/config
は正しいか(パーミッションや記述)- Deploy Keys に公開鍵(*.pub)を登録したか、またはそれが正しいか
- リモートリポジトリのパスは正しいか
- sparse-checkout で、リポジトリに存在しないファイルを無視しようとしてないか
pull したくないファイルの再設定
sparse-checkout で設定し忘れたり、設定を追加したいときは、
# git で管理しているルートへ移動
cd <DocumentRoot>
# sparse-checkout の設定
vim .git/info/sparse-checkout
# 設定を反映
git read-tree -m -u HEAD
Git 化については自分で調べに調べてようやくできた、という感じです。もしもっといい方法があれば教えてください…。