webサイトなどの資材(git管理している前提)を、特定のbranch(今回はmaster)へpushされた時だけ、公開用のディレクトリでpullして資材を反映したい。(サーバサイドhookを使用)
前提条件
リモートリポジトリはwebサイト公開用のサーバに同居。
配信用の資材は、web公開ディレクトリ(document root)配下には置かずに、symlinkで公開している。(リポジトリ内に公開したくないファイルがあるため)
/home/user
|--repository
| |--samplesite.git
| |--hooks
| |--post-receive ## 以降で説明するhookスクリプト
|--dist
| |--samplesite ## 公開用のローカルリポジトリ
| |--.git
| |--README
| |--htdocs
| |--index.htmlなど ## サイトの資材
|--www ## document root
| |--sample -> /home/user/dist/samplesite/htdocs ##公開用資材へのsymlink
最初はupdate
のhookで試したが、update
のhook scriptはpush成功前に実行されるようで、push前の資材をpullするだけになってしまった。
なのでここではmaster branchへのpushに対して公開用資材をpullするために、post-receive
のhookを使用。(repository/samplesite.git/hooks/post-receive)
#!/usr/local/bin/bash
### post-receive hook ###
while read oldrev newrev refname; do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ $branch == "master" ]; then
git --git-dir=/home/user/dist/samplesite/.git --work-tree=/home/user/dist/samplesite pull origin master
fi
done
標準入力からpushされた情報を受け取り、そこからbranch名を判定してmasterであればpullを実行している。
pullするときのオプション--git-dir
と--work-tree
はどちらも指定しないとだめでした。
ワーキングツリー外からのpullとなるため、こちらの指定が必要になる。
(--git-dir
はリポジトリの場所を、--work-tree
はワーキングツリー(作業用ディレクトリ)の場所を指定している。)
コメント