Git にはhooks
といって特定のイベントが発生するたびに自動的にスクリプトを実行する機能があります。
これらを使用すると、Gitの内部動作をカスタマイズし、開発ライフサイクルの重要なポイントでカスタマイズ可能なアクションをトリガーできます。
具体的な利用シーンとしては、コミット時にコードのフォーマットやプッシュ時にテストコードを実行するなどです。
hooks は以下の場所にサンプルが入っています。
代表的なものとして「pre-commit」(コミット時にスクリプトを実行)や「pre-push」(プッシュ時にスクリプトを実行)があります。
$ cd /PATH/TO/<Gitリポジトリ>/.git/hooks/
$ ls -1
applypatch-msg.sample
commit-msg.sample
fsmonitor-watchman.sample
post-update.sample
pre-applypatch.sample
pre-commit.sample
pre-merge-commit.sample
pre-push.sample
pre-rebase.sample
pre-receive.sample
prepare-commit-msg.sample
push-to-checkout.sample
update.sample
基本的にはGitリポジトリ単位で使用することになるのですが、グローバルにも反映できます。
※Git の 2.9.5 から使用できるようになりました。
参考「githooks」
今回は自分用のメモなので、コンフリクト発生時に修正漏れがないかどうかをチェックするスクリプトをコミット時に実行します。
1. pre-commitファイルを作成
mkdir ~/githooks && touch ~/githooks/pre-commit && chmod +x ~/githooks/pre-commit
2. pre-commitを編集
未解決のコンフリクトがないかをチェックします。
~/githooks/pre-commit
#!/bin/sh
# Check for merge conflicts
# Tested on Linux and Mac
# Simple check for merge conflics
conflicts=`git diff --cached --name-only -G"<<<<<|=====|>>>>>"`
# Something went wrong
if [[ -n "$conflicts" ]]; then
echo
echo "未解決のコンフリクトを解消してください:"
for conflict in $conflicts; do
echo $conflict
done;
exit 1;
fi
exit 0
3. グローバルに設定を反映
githooks のデフォルトディレクトリを変更します。
git config --global core.hooksPath ~/githooks