Edited at

ルール違反のgitブランチ名をpre-commitで防ぐ

チームで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/ で図解すると、

image.png

こんな感じです。


pre-commitに実行権限を付与

chmod +x pre-commit

これで準備完了です。


テスト

image.png

ブランチ名 feature/payment (pre-commit設定前に作成)にコミットしようとすると、エラーが表示されてコミットがキャンセルされます。


問題点


  • クローンする度に設定しなければならない

  • 設定してくれるかどうかは人次第

1行コマンドで自動設定する、といったいい方法を考えないとですね。