やりたいのは、こんなこと。
- ローカル PC「foo」で HTML ファイルを編集してる
- コードを書き終えたので、サーバー「bar」の中にある集中管理リポジトリーへ push
- 自動でサーバー「bar」内の公開用ディレクトリーに情報が反映される
2. から 3. の間のタイムロスを、ほとんど 0 にしたい。
こうゆう時、git の hook を使う。
リポジトリーの用意
リポジトリーの構成を、実際のコマンドを例に書いておく。
まずはローカル PC「foo」上に hoge-html プロジェクトを作成。
you@foo ~% mkdir hoge-html you@foo ~% cd hoge-html you@foo hoge-html% git init you@foo hoge-html% touch main.html you@foo hoge-html% git add main.html you@foo hoge-html% git commit -am 'first commit'
次にサーバー「bar」に、皆で使いための集中リポジトリーを立てる。公開リポジトリーは 、/vir/git に置くものとする (パーミッションは適当に設定し直して下さい)。
you@foo hoge-html% ssh bar you@bar ~% mkdir -p /var/git/hoge-html.git you@bar ~% cd /var/git/hoge-html.git you@bar hoge-html.git% git --bare init --shared you@bar hoge-html.git% exit you@foo hoge-html% git remote add origin ssh://bar/var/git/hoge-html.git you@foo hoge-html% git push origin master
最後に、bar で公開用ディレクトーの設定をする。ここでは、~/public-html ディレクトリーの内容がネットに公開されるものとする。
you@foo hoge-html% ssh bar you@bar ~% git clone /var/git/hoge-html.git you@bar ~% chmod -R g+rw hoge-html you@bar ~% chmod -R g+s hoge-html you@bar ~% ln -s hoge-html/main.html public-html/main.html
hook の設定
今回は push 後に自動実行されて欲しいから、集中リポジトリーの post-update hook を使う。post-update hook は、集中リポジトリーに push された後に一度だけ実行されるフック・スクリプト。hook はデフォールトで無効になっているので、次のやうにして有効にする。
you@bar ~% cd /var/git/hoge-html.git/hooks you@bar hooks% cp post-update.sample post-update you@bar hooks% vi post-update you@bar hooks% chmod +x post-update
post-update の中身は、こんな感じ。
you@bar hooks% cat post-update #!/bin/sh (cd /home/you/hoge-html && git --git-dir=.git pull)
ポイントは 2 つ。
- post-update hook スクリプトに実行権限 (chmod +x) を与えること
- hook の中で git pull する時、--git-dir=.git を忘れないこと
1. を忘れると hook スクリプトが動かない。2. を忘れると、「ここは git リポジトリーじゃない」と言って怒られる (この意味が分からなくて 1 時間以上ハマった)。
gitではpullするとworking treeにrepositoryの内容が反映されるんでしたっけ?
ReplyDeleteです。git pull は svn update とほぼ同じことをやってくれます。
ReplyDeleteあぁ、そうなんですね。Mercurial (hg) を使っているのですが、pullとupdateが分かれているので、ちょっと混乱しました。ありがとうございました。
ReplyDeleteMercurial 使いなのですね。私も Mercurial (hg) には興味を持っていて、本までは買っているのですが、まだ使っていません (なので hg pull と hg update の違いも分かっていなかったり... ^^;)。
ReplyDelete最近は Google Code が Mercurial に対応したりと、git と並んで面白い SCM だと思っています。