はじめに
普段commitメッセージは
refs #9999 ○○○が誤っていた為、これを修正。
のようにしてRedmineのチケットと紐付けているのですが、
commitメッセージ冒頭のチケット番号部分”refs #9999″のタイピングが面倒に感じていました。
これはgitのhookを利用することで改善できました。
hookとは
※ここは自分の知識の整理の為に記載するので、知っている方は飛ばして下さい。
大きく分けてクライアントサイドで実行されるhookと、サーバーサイドで実行されるhookの
2種類があり、幾つかの言語で独自のスクリプトを実行できる。
クライアントサイドのフックは
- pre-commit(コミットメッセージ入力前)
- prepare-commit-msg(コミットメッセージエディタ起動直前、デフォルトメッセージ生成直後)
- commit-msg(コミットメッセージ保存直後)
- post-commit(コミットプロセス完了後)
- その他にも git rebase コマンド実行時、git checkout コマンド実行時、git merge コマンド実行時等、様々なタイミングで呼び出し可能のようです。
サーバーサイドのフックは
- pre-receive(push処理実行直後)
- post-receive(push処理完了後)
- update(push処理完了後)※ブランチ毎に実行される
gitのhookの種類についてはコチラに詳しく説明が有ります。
やりたいこと
- 現在のブランチのブランチ名が fix-#9999-○○○のバグ修正 のように
Redmineのチケット番号と紐づいたブランチの場合、
チケット番号である “#9999” を取得して、Redmineとの紐付けキーワードの
“ref”と一緒にcommit時のメッセージに追加する。 - ただし現在のブランチが master の場合、何もしたくない。
作成したスクリプト
対象スクリプトはcommit-msg を使用しました。
というのも、普段は git commit -m “コミット理由” という形で -m オプションを利用し、エディタを開かずにメッセージを入力している為です。
-m オプションを使用せずにエディタでメッセージを入力する場合、
prepare-commit-msg が良いかと思います。
以下スクリプト本体、作成言語は shell です。
#!/bin/sh ticket=`git branch | grep "*" | awk '{print $2}' | sed -e 's/^.*-\(#[0-9]*\)-.*/\1/g'` if [[ $ticket =~ \#[0-9]* ]]; then mv $1 $1.tmp echo -n "refs $ticket " > $1 cat $1.tmp >> $1 fi
$1にはコミットメッセージが格納されている。
git branch でブランチの一覧を取得。
grep “*” でカレントのみ抽出。
awk ‘{print $2}’ で “*” 以降のブランチ名のみ抽出。
sed -e ‘s/^.*-\(#[0-9]*\)-.*/\1/g’ で#○○○○ 部分を抽出。
$ticket が #と数値 の場合に、コミットメッセージに refs #○○○○を追加する、と。
おわりに
普段の業務で使わない言語は、こういう所で使っていかないと身につかないんだろうなぁ。。。
今回のhookはあくまでクライアントで実行されるので、
チーム内でのコミットメッセージの標準化を目的とする場合は、
サーバサイドでのhookを利用する必要がある、と思う。