2012年6月4日月曜日

post-updateでちょっとハマったこと

post-updateを使ってssh経由で共有リポジトリにpushしたとき、自動的にローカルリポジトリを更新したい場合などあると思います。

例)
Server A
    └ repo-sv.git (共有リポジトリ)
    └ repo (ローカルリポジトリ)

Client A
    └ repo (ローカルリポジトリ)


  1. Client A が repo (ローカルリポジトリ) で変更・コミット
  2. Client A が Server A の共有リポジトリへpush
  3. Server A の repo (ローカルリポジトリ) を自動的に更新


これを実現するために hooks/post-update を使用します。

ハマったんで流れを書いておきます。

まず Clien A でローカルリポジトリを作成・コミットします
$ mkdir repo
$ cd repo
$ git init
$ touch test.txt
$ git add .
$ git commit -m 'first'

次に Server A に共有リポジトリを作成します。
$ mkdir repo-sv.git
$ cd repo-sv.git
$ git init --bare --shared

次に Client A に戻り、共有リポジトリへpushします。
$ git remote add origin ssh://@/repo-sv.git
$ git push origin master

これでpushは完了です。
ただこれだと普通に共有リポジトリにpushしただけです。
自動的にローカルリポジトリを更新するため、hooks/post-updateを修正します。
$ cd hooks
$ cp post-update.sample post-update
$ vi post-update

// 中身はこんなかんじ
#!/bin/sh

cd /repo && git --git-dir=.git pull

// そのまま共有リポジトリからcloneしてローカルリポジトリを作成
$ cd /
$ git clone /repo-sv.git repo

// ファイルがあるか確認する
$ ls repo
test.txt

これで Server A にもローカルリポジトリができたことがわかると思います。
hooks/post-updateの処理も追加していますので Client A に戻って再度コミット・プッシュしてみましょう。
$ touch add.txt
$ git add .
$ git commit -m 'added'
$ git push origin master

Server A でローカルリポジトリ内を確認してみると先ほど追加した add.txt が作成されていると思います。
$ ls /repo
test.txt add.txt

これでOK。

自分がハマったのは Server A でローカルリポジトリを作成するとき、clone先をsshで指定していました。
一見問題ないように思えるんですが(実際にcloneもpushもpullもうまくいくと思います) Client A が push したとき、permissionのエラーがでてしまいました。

けっこうハマったけどとりあえず動いたんでまぁいいか。




0 件のコメント:

コメントを投稿