gitのpost-receiveフックを使ってみる(全部ローカル)

全部ローカルで動くようなパターンをやってみた。post-receiveの記事は、サーバーとかに対してのやり方は書いてあるけど、ローカルでやる方法は見当たらなかったので書いてみた。

どんな動きをするかテストをしてみる。

やって見る内容は、この3つのリポジトリで流れを確認する。

~/foo/test          # ローカルリポジトリ
~/foo/repo.git    # ベアリポジトリ
~/foo/receive     # post-receiveが働いたときにデプロイされるディレクトリ

テスト用リポジトリを作る (~/foo/test )

まず
~/foo/testから作る。これはpost-receiveを動かすためのディレクトリになる。

cd ~/foo/
mkdir test
cd test/
git init
touch test.txt
echo "test" >> test.txt
git add . && git commit -m "test commit"
>> 出力先に上書き保存をする
&& &&の左のコマンドが成功したら右のコマンドを実行する

こんな風にやってまずはテスト用のリポジトリを作る。

テスト用リモートを作る (~/foo/repo.git)

次に ~/foo/repo.git というリモートを作る。これは ~/foo/test からのpushを受けるためのディレクトリになる。

cd ~/foo/
mkdir repo.git
cd repo.git
git init --bare   #リモートリポジトリを作るためにbareリポジトリを作る

repo.gitというリモートを作ったら、~/foo/test リポジトリに移動して push する

cd ~/foo/test
git push ~/foo/repo.git master

自動でpushされる場所を作る (~/foo/receive)

最後は ~/foo/receive というディレクトリを作る。これはフックの時にpushするためのリポジトリになる。

cd ~/foo/
git clone repo.git receive   # cloneのときreceiveというディレクトリ名でクローンする

フックの設定をする(~/foo/repo.git)

recieveを作ったらフックを使うための準備をする。場所は~/foo/repo.git/hooksのところのpost-receiveを使う。

cd repo.git/hooks/

emacsとかvimとかnanoとかgeditなどなどの編集できるものを使う。

nano post-receive

編集画面に入ったら下のコードをコピペする。ペーストは端末ならCtrl + Shift + v でできるはず。だめなら右クリックで。
GUIの方ならエディタごとにペーストは異なる。

#!/bin/sh

# . /home/username/repo.git/hooks/post-receive
echo "test post-receive"
pwd # post-receiveが実行されるときはrepo.git/にいる
cd ~/foo/receive # --git-dirを設定するために移動する
pwd
git --git-dir=.git pull ../repo.git master
pwd カレントディレクトリを出力する

最後に実行権限を付けないとだめなのでchmodを実行しておく。

chmod +x post-receive

実行できるかの確認

ここまでちゃんとできてると、下のコマンドを実行するとうまいことローカルだけでpost-receiveが動くようになる。

cd ~/foo/test
echo "test" >> test.txt && git add . && git commit -m "test commit" && git push ../repo.git/ master

実行結果はだいたいこんなかんじに成る

[pogin@localhost ~]
$ cd foo/test/
[pogin@localhost test]
$ echo "test" >> test.txt && git add . && git commit -m "test commit" && git push ../repo.git/ master
[master 88427c1] test commit
 1 file changed, 1 insertion(+)
Counting objects: 5, done.
Writing objects: 100% (3/3), 256 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: test post-receive
remote: /home/pogin/foo/repo.git
remote: /home/pogin/foo/receive
remote: From ../repo
remote:  * branch            master     -> FETCH_HEAD
remote: Updating 6623237..88427c1
remote: Fast-forward
remote:  test.txt | 1 +
remote:  1 file changed, 1 insertion(+)
To ../repo.git/
   6623237..88427c1  master -> master

これで、~/foo/repo.gitにpushしたときにpost-receive-hookが作動して、~/foo/receive にデプロイ?されるようになる。

あまり需要がないかもしれないけど、サーバーを持ってなくて、とりあえずローカルにサイトを構築していじる必要のないサイトを再現しておくときにこの手法が役に立つかもしれない。

実行用のshell scriptも作ってみたんで早く確認したい人はどうぞ。

追記2013.7.20

日本語がおかしかったり、説明不足のところを少し追記。