Gitのコミットメッセージに自動でブランチ名を入れる方法
はじめに
「Gitのコミットメッセージの行頭にブランチ名を入れるように」というルールがある案件に参画したのですが、手動でブランチ名入れるのがあまりにも面倒臭いので、自動挿入機能を作ることにしました。
実現方法
Gitのhooksにprepare-commit-msg
というスクリプトがあります。
このスクリプトはコミットメッセージ生成直後に実行される処理で、この処理にブランチ名を挿入する機能を入れてあげることで、ブランチ名自動挿入機能を実現できます。
実装
コードはこちら
#!/bin/bash
readonly COMMIT_MSG_FILE=$1
readonly COMMIT_SOURCE=$2
case "${COMMIT_SOURCE}" in
commit) # use -c/-C/--amend
: # 何もしない
;;
*)
# ブランチ名取得
branch_name=$(git name-rev --name-only HEAD)
# ブランチ名をコミットメッセージの前に挿入する
perl -p -i.bak -e "s/^/${branch_name} /g" $COMMIT_MSG_FILE
;;
esac
このスクリプトを.git/hooks
以下に配置し、実行権限を与えて(chmod +x prepare-commit-msg
などを実行)あげることで、コミット時に実行されるようになります。
解説
コードの各部分に関する解説をちょろっと
readonly COMMIT_MSG_FILE=$1
readonly COMMIT_SOURCE=$2
スクリプト実行時に受け取る引数です。
COMMIT_MSG_FILE
はコミット時のメッセージを保持しているファイルで、このファイルのテキストを書き換えてあげることで、コミット時のメッセージを編集することができます。
COMMIT_SOURCE
は何のコマンド、オプションでコミットメッセージが生成されたかが入っている値です。今回は--amend
時にはブランチ名の挿入を行なって欲しくないので、その判定を行うためにこの値を利用します。
case "${COMMIT_SOURCE}" in
commit) # use -c/-C/--amend
: # --amend時には何もしない
;;
*)
# ブランチ名取得
branch_name=$(git name-rev --name-only HEAD)
# ブランチ名をコミットメッセージの前に挿入する
perl -p -i.bak -e "s/^/${branch_name} /g" $COMMIT_MSG_FILE
;;
esa
COMMIT_SOURCE
の値を参照し、--amend
以外の時にブランチ名の自動挿入機能が実行されるように場合分けを行なっています。
後はブランチ名の取得と、ブランチ名をCOMMIT_MSG_FILE
のテキストの行頭に挿入する処理を行なっているだけです。
さいごに
Gitの運用ルールがあることは良いことですが、ルールがあればあるほど、そのルールを守るコストはどんどん増えていきます。ぶっちゃけ大変です。
無駄に疲弊するのもしんどいので、できるところは積極的に自動化しちゃいましょう。
Discussion