Git
pre-commit

ルール違反の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行コマンドで自動設定する、といったいい方法を考えないとですね。