チームでgitを用いて開発する際、ブランチ名にある一定のルールを設けることがあると思います。
ただ、周知しても忘れるのが人間。
ドキュメントを読まないのも人間。
なので、自動でブランチ名をチェックして、不正な場合はコミットをさせないように設定できます。
前提
※macOSでの動作を確認しています。Windows等の場合は少し書き方が変わると思います(すみません、未検証です)。
pre-commitファイルを用意
クローンしているレポジトリのルートに移動してください。
mkdir -p .git/hooks
touch pre-commit
viではなくてもいいですが、好きなエディタで以下のファイルを編集してください。
2019/01/18追記 インタラクティブリベースで困るのでHEADを追加しました。
.git/hooks/pre-commit
#!/usr/bin/env bash
readonly BRANCH_NAME_RULES='^(HEAD|master|develop|release\/(.+)|(?:bugfix|feature|hotfix)\/PROJECT-[0-9]+(?:-.*)*)$'
readonly BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
readonly BRANCH_NAME_LENGTH=$(echo ${BRANCH_NAME} | grep -E ${BRANCH_NAME_RULES} | wc -c | tr -d ' ')
if [ ${BRANCH_NAME_LENGTH} -eq 0 ] ; then
echo ""
echo -e '\033[0;31;43m ERROR! \033[m in pre-commit hook.'
echo ""
echo -e "Your branch name "'\033[1m'${BRANCH_NAME}'\033[m'" is not suitable for our rule."
echo "Please fix your branch name before commiting!"
echo ""
echo "Abort commiting."
echo ""
exit 1
fi
BRANCH_NAME_RULES
がルールチェック用の正規表現です。
このファイルの例では、
- master
- develop
- release/hogehoge
- bugfix/PROJECT-123
- bugfix/PROJECT-123-foo
- feature/PROJECT-456
- feature/PROJECT-456-bar
- hotfix/PROJECT-789
- hotfix/PROJECT-789-baz
- HEAD
などが許可されます。
https://www.debuggex.com/ で図解すると、
こんな感じです。
pre-commitに実行権限を付与
chmod +x pre-commit
これで準備完了です。
テスト
ブランチ名 feature/payment
(pre-commit設定前に作成)にコミットしようとすると、エラーが表示されてコミットがキャンセルされます。
問題点
- クローンする度に設定しなければならない
- 設定してくれるかどうかは人次第
1行コマンドで自動設定する、といったいい方法を考えないとですね。