コミットメッセージが条件に合っていない
チーム開発するにあたって、コミットメッセージにルールがある場合があると思います。
例えば、fix #12のように、該当のissueを指すメッセージがついていないなど。
でも、それを忘れてコミットすることはあると思います。
それに気がつける仕組みが欲しい。
コミット前にチェックするスクリプト
.git/hooks/commit-msg
このファイルに、スクリプトを書くと、コミット前にこのスクリプトが走ります。
このファイルに、コミット前にメッセージを確認するスクリプトを書いてみましょう
作成例
#!/bin/bash #.git/COMMIT_EDITMSGが条件にあっていればコマンドを実行 #条件にあっていなければ、メッセージにXXX-**を追加して、コマンドを行う if cat $1 | grep -e '^XXX-.* .*$' ; then echo 'commit message is correct' exit 0 else number="`git rev-parse --abbrev-ref HEAD | sed -E 's/.*\/(.*)$/\1/'`" past_message=`cat $1` changed_message=XXX-$number' '$past_message echo 'commit message do not have ticket number.' echo 'your message : "'$past_message'"' echo 'changed message: "'$changed_message'"' echo 'Do you want to change? (y/n/exit)' exec < /dev/tty read ans case $ans in [Yy] ) # コミットメッセージを変えてコミット echo $changed_message>$1 exit 0 ;; [Nn] ) # コミットメッセージを変えずコミット exit 0 ;; * ) # コミットしない echo 'exit' exit 1 ;; esac fi
仕組み
メッセージチェック
$1にはメッセージが入ります。
if cat $1 | grep -e '^XXX-.* .*$' ; then echo 'commit message is correct' exit 0
ここで、チェックして、問題がなければコミットを続けるために、exit0をします。
ブランチ名をチェック
これはチェック内容の例ですが、
number="`git rev-parse --abbrev-ref HEAD | sed -E 's/.*\/(.*)$/\1/'`"
ここで、ブランチ名をチェックして、ブランチ名についていた数値を取得しています。
私は自動変換の仕組みも作りたかったので、
past_message=`cat $1` changed_message=XXX-$number' '$past_message
このように、変更前後のコミットメッセージを作成しました。
ユーザーに入力を求める
exec < /dev/tty read ans
ここで、ユーザーに入力を求めます。
case $ans in [Yy] ) # コミットメッセージを変えてコミット echo $changed_message>$1 exit 0 ;; [Nn] ) # コミットメッセージを変えずコミット exit 0 ;; * ) # コミットしない echo 'exit' exit 1 ;; esac
受け取った入力に合わせて、コミットに対するアクションを行います。
$1に対して値を変更することで、最終的なコミットメッセージが変わるので、入力が Y
か y
であれば、コミットメッセージの変更を行っています。
コミットメッセージで良い開発を
コミットメッセージでチーム開発をよく回そうとすることはよくあると思います。
でも、たまに上手く運用できない時がありますが、自動化がそれを助けるときもあります。
ぜひcommit-msgなどを活用して、自動化出来るところは自動化してみましょう!