2009-05-27

Git で集中リポジトリーに push したら、自動でワーク・ディレクトリーにも反映させる

やりたいのは、こんなこと。

  1. ローカル PC「foo」で HTML ファイルを編集してる
  2. コードを書き終えたので、サーバー「bar」の中にある集中管理リポジトリーへ push
  3. 自動でサーバー「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 つ。

  1. post-update hook スクリプトに実行権限 (chmod +x) を与えること
  2. hook の中で git pull する時、--git-dir=.git を忘れないこと

1. を忘れると hook スクリプトが動かない。2. を忘れると、「ここは git リポジトリーじゃない」と言って怒られる (この意味が分からなくて 1 時間以上ハマった)。

ref

4 comments:

  1. gitではpullするとworking treeにrepositoryの内容が反映されるんでしたっけ?

    ReplyDelete
  2. です。git pull は svn update とほぼ同じことをやってくれます。

    ReplyDelete
  3. あぁ、そうなんですね。Mercurial (hg) を使っているのですが、pullとupdateが分かれているので、ちょっと混乱しました。ありがとうございました。

    ReplyDelete
  4. Mercurial 使いなのですね。私も Mercurial (hg) には興味を持っていて、本までは買っているのですが、まだ使っていません (なので hg pull と hg update の違いも分かっていなかったり... ^^;)。

    最近は Google Code が Mercurial に対応したりと、git と並んで面白い SCM だと思っています。

    ReplyDelete