gitのhookを利用してcommit時にRedmineのチケット番号をメッセージに追加する。

  • 2018.12.19
  • Git
gitのhookを利用してcommit時にRedmineのチケット番号をメッセージに追加する。
                 
最終更新日から90日以上経過しています。

はじめに

普段commitメッセージは
refs #9999 ○○○が誤っていた為、これを修正。
のようにしてRedmineのチケットと紐付けているのですが、
commitメッセージ冒頭のチケット番号部分”refs #9999″のタイピングが面倒に感じていました。
これはgitのhookを利用することで改善できました。

hookとは

※ここは自分の知識の整理の為に記載するので、知っている方は飛ばして下さい。

大きく分けてクライアントサイドで実行されるhookと、サーバーサイドで実行されるhookの
2種類があり、幾つかの言語で独自のスクリプトを実行できる。

クライアントサイドのフックは

  • pre-commit(コミットメッセージ入力前)
  • prepare-commit-msg(コミットメッセージエディタ起動直前、デフォルトメッセージ生成直後)
  • commit-msg(コミットメッセージ保存直後)
  • post-commit(コミットプロセス完了後)
  • その他にも git rebase コマンド実行時、git checkout コマンド実行時、git merge コマンド実行時等、様々なタイミングで呼び出し可能のようです。

サーバーサイドのフックは

  • pre-receive(push処理実行直後)
  • post-receive(push処理完了後)
  • update(push処理完了後)※ブランチ毎に実行される

 

gitのhookの種類についてはコチラに詳しく説明が有ります。

やりたいこと

  • 現在のブランチのブランチ名が fix-#9999-○○○のバグ修正 のように
    Redmineのチケット番号と紐づいたブランチの場合、
    チケット番号である “#9999” を取得して、Redmineとの紐付けキーワードの
    “ref”と一緒にcommit時のメッセージに追加する。
  • ただし現在のブランチが master の場合、何もしたくない。

作成したスクリプト

対象スクリプトはcommit-msg を使用しました。
というのも、普段は git commit -m “コミット理由” という形で -m オプションを利用し、エディタを開かずにメッセージを入力している為です。
-m オプションを使用せずにエディタでメッセージを入力する場合、
prepare-commit-msg が良いかと思います。

以下スクリプト本体、作成言語は shell です。

#!/bin/sh
ticket=`git branch | grep "*" | awk '{print $2}' | sed -e 's/^.*-\(#[0-9]*\)-.*/\1/g'`
if [[ $ticket =~ \#[0-9]* ]]; then
    mv $1 $1.tmp
    echo -n "refs $ticket " > $1
    cat $1.tmp >> $1
fi

 

$1にはコミットメッセージが格納されている。
git branch でブランチの一覧を取得。
grep “*” でカレントのみ抽出。
awk ‘{print $2}’ で “*” 以降のブランチ名のみ抽出。
sed -e ‘s/^.*-\(#[0-9]*\)-.*/\1/g’ で#○○○○ 部分を抽出。
$ticket が #と数値 の場合に、コミットメッセージに refs #○○○○を追加する、と。

 

おわりに

普段の業務で使わない言語は、こういう所で使っていかないと身につかないんだろうなぁ。。。
今回のhookはあくまでクライアントで実行されるので、
チーム内でのコミットメッセージの標準化を目的とする場合は、
サーバサイドでのhookを利用する必要がある、と思う。

Gitカテゴリの最新記事