Git の commit-msg hook でコミットメッセージにチケット番号が含まれるかチェックする
概要
ここ最近のBTSのチケットとバージョン管理ツールは
コミットコメントによる連携機能が標準で搭載されているものが多いです。
しかしコミット時にチケット番号を記述し忘れて連携できず・・・などと言うことがあると思います。
git は履歴の改ざんができるので後から修正することもできますが、少し手間がかかります。
そこで、フックを利用してチケット番号を含んでいないコミットを拒否するようにします。
commit-msg フック
commit-msg入力後に処理を挿入できます。
下記ファイルに処理を記述します。
./.git/hooks/commit-msg
記述する言語は好みで。
私はRubyが好きなのでRubyで書きました。
commit-msg コード
Rubyで書きました。
BTSが要求するチケット番号は シャープと数字の書式だとします。
例えば「#9」や「#25」。
.git\hooks\commit-msg
#!/usr/bin/env ruby
message = File.read(ARGV[0])
$regex = /#\d+/
if !$regex.match(message)
puts "[POLICY] No Ticket No Commit!!"
exit 1
end
チケット番号なしでコミット
$ git commit -m 'no ticket No'
[POLICY] No Ticket No Commit!!
$ echo $?
1
# コミットがキャンセルされたことを確認
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: hoge.txt
#
チケット番号ありでコミット
$ git commit -m '#23 fix hoge.txt'
[master 2b98dfa] #23 fix hoge.txt
1 files changed, 1 insertions(+), 0 deletions(-)
$ echo $?
0
# コミットされたことを確認
$ git status
# On branch master
nothing to commit (working directory clean)
備考
フックを利用してこんなことをすると良いかも
- README.mdなどドキュメントしか変更していない場合はコミットコメントを改ざんして [ci skip] を付与し、
Travis CIをスキップする - コミットコメントが1行目に見出し、2行目に空行、3行目以降に詳細、のフォーマットになっているかチェックする