👌

Gitのコミットメッセージに自動でブランチ名を入れる方法

2021/07/12に公開

はじめに

「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