git commit時に文法ミスやブランチを間違ってたらcommitを中止する

  • 7
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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

参考

シェルスクリプト

http://blog.suz-lab.com/2012/09/try-catch.html

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