エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Git】条件を満たさないコミットメッセージを変更してコミットする【808日目】

コミットメッセージが条件に合っていない

チーム開発するにあたって、コミットメッセージにルールがある場合があると思います。

例えば、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に対して値を変更することで、最終的なコミットメッセージが変わるので、入力が Yyであれば、コミットメッセージの変更を行っています。

コミットメッセージで良い開発を

コミットメッセージでチーム開発をよく回そうとすることはよくあると思います。

でも、たまに上手く運用できない時がありますが、自動化がそれを助けるときもあります。

ぜひcommit-msgなどを活用して、自動化出来るところは自動化してみましょう!