gitでチーム開発を行っているとき、コメットメッセージに特定のルールが指定されている場合があります。
gitではフック処理というものがあり、commit-msgフックを利用することで、コミットログが特定の条件を満たしていないときにcommit処理を行えないようにブロックさせることができます。
本記事ではcommit-msgフックを使ってチェックする処理の作り方を説明します。
今回、想定するルールは、"コミットログの1行目のissue trackingツールのチケットNoが含まれていること"とし、チケットNoは"HPB-9999"の形式とします。通常はbashなどのシェルスクリプトでフックを作成することが多いですが、今回はあえてPHPでフックのスクリプトを作成してみます。
フックファイルを作成する
まず、フックスクリプトのファイルを作成します。
touch .git/hooks/commit-msg
chmod 755 .git/hooks/commit-msg
次に、スクリプトの中身を作成します。
#!/usr/bin/env php
<?php
$lines = explode(PHP_EOL, file_get_contents($argv[1]));
if (!preg_match('/^HPB-[0-9]* /', $lines[0])) {
echo 'コミットログの1行目にはチケット番号(HPB-9999)を含める必要があります' . PHP_EOL;
exit(1);
}
commit-msgフックでは、コミットログのメッセージが入っているファイル名が$argv[1]で渡されるので、これをfile_get_contents()で読み込みます。さらに、explode()で改行文字で分割した配列にし、$lines変数に代入します。
$lines[0]がコミットログの1行目なので、正規表現を使って1行目の先頭に"HPB-9999 "の形式でログが書かれているかをチェックしています。
チェックに引っかかったら(=ログが書かれていなかったら)、エラーメッセージを表示し、exit()で1を返しています。gitはこのコマンドの結果が0以外の値を返したときに、コミット処理を中断します。
これで準備は完了です。
動作実行する
誤った形式でコミットメッセージを書いてcommitすると以下のようにメッセージが表示され、コミットが行われません。
% git commit -m "invalid comment"
コミットログの1行目にはチケット番号(HPB-9999)を含める必要があります
SoureTreeを使っている場合でも、エラーメッセージは確認できます。
正しい形式でコミットログを書くと、もちろんコミットできます。
% git commit -m "HPB-1234 piyo"
1 file changed, 1 insertion(+)