Git commit時に間違ったブランチにcommitや文法ミスに気づかないでcommitしてしまうのを防ぐために事前に防ぐスクリプトを書いたのでメモします。
Git Hookの設定をする
pre-commitファイルを作成する。
$ vim .git/hooks/pre-commit
以下のように編集する。
#!/bin/bash
#PHPの文法ミスのチェック
set -e
trap 'exit 1' ERR
find '<対象ディレクトリのパス>' -name "*.php" | xargs -n1 php -l
#branch間違いのチェック
PREVENT_COMMIT_BRANCH='master'
CURRENT_BRANCH=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [$PREVENT_COMMIT_BRANCH = $CURRENT_BRANCH]
then
exit 1
else
exit 0
fi
文法ミスのチェックでしているパスですが、広範囲だとcommitに時間がかかっているので、特に気になる部分にフォーカスしたパスを指定して、いくつか文法チェックすると良い。
なお、デフォルトであるpre-commit.sampleなども参考にすると良い。
実行権限を与える。
$ chmod +x pre-commit
以上で、もし文法ミスやブランチが間違っているとcommittを中止してくれるようになる。
実際に文法ミスを含めてcommitすると、例えば、以下のようにエラーが出てcommitを誤ってしなくなる。
$ git commit
PHP Parse error: syntax error, unexpected 'if' (T_IF) in '<PATH>'/hoge.php on line 54
xargs: php: 終了ステータス 255。中止しています
(追記) Git Hookの種類
Git Hookには以下のような種類が存在する。
#am系
applypatch-msg
pre-applypatch
post-applypatch
#commit系
pre-commit
prepare-commit-msg
commit-msg
post-commit
post-rewrite
#rebase系
pre-rebase
#checkout系
post-checkout
#merge系
post-merge
#push系
pre-push
pre-receive
update
post-receive
post-update
#git-receive-pack系
push-to-checkout
#gc系
pre-auto-gc
参考
シェルスクリプト
Git hook挙動
https://dev.ghost.org/prevent-master-push/
http://qiita.com/fnobi/items/98bd5d1c83c010842733
Git hook種類
https://git-scm.com/docs/githooks
http://qiita.com/mima_ita/items/dcaa3789022d2a9ab929