コミットコメントを意地でも書かせたい

コミットコメントを意地でも書かせたいと思うことがあります。
でも意外と書いてもらえなかったりします。
酷い場合だと

バグ修正

とか

対応した

だけ書いてあったりします。

注意するのも疲れるし、大抵の場合は注意しても直りません。

そんなわけで、私が面倒を見ている環境だとpre-commit-hooksを使って、規定のバイト数のコメント書かないとコミット出来ないようにして対応しています。

単にエラーだと障碍だと騒ぐ人達が居るので、コメントの重要性をエラーメッセージで語りかけるようにもしてたりします(笑)

以下はTracLightning環境下で動作する(はず)のScriptです。*1

キーワードの定期的な見直しは必要ですが、コメントを書かないとコミットできなくなるので意識付けを行うのには有用だと思います。コミットコメントが書いてもらえないと悩んでいる方は試してみては如何でしょうか。

#結構やっつけなScriptなので、突っ込みや質問は大歓迎です(笑)

用意するもの

  • コミット前に実行するhooks Script(pre-commit.bat)
  • 文字数としてカウントしないキーワード一覧(pre-commit-filter.sed)
    • %TRAC_BAT_ROOT%以下に置く
    • 時々コメントを眺めて追加していくと良いと思います。*2
  • NGワード一覧(pre-commit-filter_sp.sed)
    • %TRAC_BAT_ROOT%以下に置く
    • 規定バイト数には足りてるが、半定型化していて逃げ道的なコメントを登録しておく
pre-commit.bat
:: PRE-COMMIT HOOK
::   [1] REPOS-PATH   (the path to this repository)
::   [2] TXN-NAME     (the name of the txn about to be committed)

SET REPOS=%1
SET TXN=%2
SET SVNLOOK=D:\TracLight\CollabNetSVN\svnlook.exe

SET TRAC_BAT_ROOT=C:\TracLight\bin

Set LENGTH=10

%SVNLOOK% log -t "%TXN%" "%REPOS%"|python.exe -c "import sys,string;print(string.replace(sys.stdin.read(),'\n',''));"|CALL %TRAC_BAT_ROOT%\sed -f %TRAC_BAT_ROOT%\pre-commit-filter.sed>%REPOS%\hooks\%TXN%.TXT
for %%F in ("%REPOS%\hooks\%TXN%.TXT") do if %%~zF LEQ %LENGTH% goto _NOCOMMIT

%SVNLOOK% log -t "%TXN%" "%REPOS%"|%TRAC_BAT_ROOT%\sed -f %TRAC_BAT_ROOT%\pre-commit-filter_sp.sed>%REPOS%\hooks\%TXN%.TXT
for %%F in ("%REPOS%\hooks\%TXN%.TXT") do if %%~zF GTR 0 goto _NOCOMMIT

:OK
del "%REPOS%\hooks\%TXN%.TXT"
exit 0

:_NOCOMMIT
del "%REPOS%\hooks\%TXN%.TXT"
echo ---------------------------------------------------------------->&2
echo 最低でも何故変更したのかのを、>&2
echo 未来の自分と保守担当者に向かって書きましょう。>&2
echo.>&2
echo コミットログは未来の自分へのメッセージです。>&2
echo 今は不要に思っても、未来にはきっと役に立ちます。>&2
echo.>&2
echo (有効なメッセージを %LENGTH%byte 以上)>&2

EXIT/B 1
pre-commit-filter.sed
y/[0123456789/]/[0123456789\/]/
y/[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]/[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]/
y/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]/[abcdefghijklmnopqrstuvwxyz]/
s/[0-9]{2,4}\/[0-9]{1,2}\/[0-9]{1,2}//g
s/[0-9]{2,4}年[0-9]{1,2}月[0-9]{1,2}日//g
s/^[0-9]{1,2}\/[0-9]{1,2}//g
s/ //g
s/ //g
s/\-\-*/\-/g
s/\.\.*/\./g
s/\(.\)\1\1*/\1/g
s/^新規//g
s/新規作成//g
s/\(\#[0-9]{1,4}\) \(([0-9]{1,2}\.[0-9])\)/\1/g
s/\(\#[0-9]{1,4}\) \(([0-9]{1,2})\)/\1/g
s/ソースの修正を行いました//g
s/単体テスト実施 //g
s/ソースあげます//g
s/メッセージ変更//g
s/対応しました//g
s/ソース手直ししました//g
s/内容を修正しました//g
s/とりあえず現状をコミット//g
s/バグ対応バージョン//g
s/バグ対応//g
s/バグ//g
s/バージョン変更//g
s/ブランチ切り//g
s/やりなおし//g
s/とりあえず//g
s/ソース手直し//g
s/手直し//g
s/共通ソース//g
s/履歴シート//g
s/あいうえお//g
s/不具合の//
s/不具合を//
s/不具合//g
s/一部訂正//g
s/コミットします//g
s/コミット//g
s/コメント//g
s/仕様変更につき//g
s/仕様変更//g
s/公開//g
s/訂正しました//g
s/訂正します//g
s/訂正した//g
s/訂正のため//g
s/修正しました//g
s/修正します//g
s/修正した//g
s/修正のため//g
s/修正の//g
s/修正//g
s/変更した//g
s/変更します//g
s/変更しました//g
s/変更//g
s/追加しました//g
s/追加します//g
s/追加した//g
s/追加//g
s/更新しました//g
s/更新します//g
s/更新した//g
s/更新//g
s/削除しました//g
s/削除します//g
s/削除した//g
s/削除//g
s/作成しました//g
s/作成します//g
s/作成した//g
s/作成//g
s/移動しました//g
s/移動した//g
s/移動//g
s/依頼//g
s/改修しました//g
s/改修した//g
s/の改修分//g
s/改修分//g
s/の改修//g
s/改修//g
s/緊急//g
s/管理//g
s/割愛//g
s/完了しました//g
s/完了した//g
s/完了//g
s/反映しました//g
s/反映します//g
s/反映した//g
s/反映//g
s/訂正しました//g
s/訂正します//g
s/訂正した//g
s/訂正//g
s/実装中です//g
s/実装中//g
s/実装//g
s/直しました//g
s/直した//g
s/実装中です//g
s/実装中//g
s/処理//g
s/恐縮です//g
s/いろいろ//g
s/をついき//g
s/をついか//g
s/色々//g
s/リクエストを//g
s/リクエスト//g
s/^仕様書//g
s/^仕様//g
s/^概要//g
s/の為//g
s/update//g
s/transition//g
s/todo//g
s/^refs//g
s/^ref//g
s/^fixed//g
s/^fix//g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s/\n//g
pre-commit-filter_sp.sed
/コメント書くの面倒/p
d

*1:他の環境でもsedpythonが入っていれば動作すると思います。

*2:実際には担当者の名前や会社名、システム名なども書いてあります。