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
日本語がおかしかったり、説明不足のところを少し追記。