[git]masterへのpushをトリガーにしてファイルを公開する(hook)

git

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はワーキングツリー(作業用ディレクトリ)の場所を指定している。)

コメント

タイトルとURLをコピーしました