ざるごのブログ

GitHubでgit commit -mのコミットメッセージにIssue番号を自動で含める方法

投稿日時: 2023/03/08 17:11

最終更新日時: 2023/03/08 17:11

どうも,京大博士課程のざるご( @zalgo3 )です. この記事では,GitのコミットメッセージにIssue番号を自動で付与する方法を,Git初心者向けに解説します.

コミットメッセージのIssue番号は忘れがち

GitHubでIssueを建てて作業しているときに,Issue番号を#1みたいな感じでコミットメッセージに含めると,Issueから関連するコミットを参照できて便利だったりします.

ですが,コミットするときにわりと忘れるんですよねこれ. git amendで修正する羽目になることが多いです.

そこで,何も書いていなくても自動でIssue番号をコミットメッセージに含めてもらいましょう.

前提として,作業しているブランチはissue/5/hogeみたいな名前だとします.

どうすればいいか

次のファイルをcommit-msgという名前で.git/hooksに保存し,chmod +xで実行権限を与えましょう.

#!/bin/bash issue_num=`git branch --show-current | cut -d/ -f2 | tr -d "\n" | sed -e "s/\([0-9]*\).*/#\1 /g"` if [[ $issue_num =~ \#[0-9]* ]]; then mv $1 $1.tmp echo -n "$issue_num" > $1 cat $1.tmp >> $1 fi

どうなるか

git commit -m "変更加えた"

とコミットすると,コミットメッセージが

"#5 変更加えた"

のようになる.

コードの解説

2行目

issue_num=`git branch --show-current | cut -d/ -f2 | tr -d "\n" | sed -e "s/\([0-9]*\).*/#\1 /g"`

次の手順で,issue_numという変数に,#5などの文字列を格納しています.

  1. git branch --show-current で現在のブランチを取得 ( ex. issue/5/hoge )
  2. cut -d/ -f2 で,スラッシュで区切られた2番目の要素を取得 ( ex. 5 )
  3. tr -d "\n" で,末尾の改行を消去
  4. sed -e "s/([0-9]_)._/#\1 /g" で,数字の前に#,後に空白をつける ( ex. #5 )

4-8行目

if [[ $issue_num =~ \#[0-9]* ]]; then mv $1 $1.tmp echo -n "$issue_num" > $1 cat $1.tmp >> $1 fi

コミットメッセージの先頭に,先程定義したissue_numの値を挿入しています.

  1. if [[ $issue_num =~ #[0-9]* ]];で,issue_num#5 などの値になっているか確認.
  2. mv $1 $1.tmp で,$1(コミットメッセージ)の値を$1.tmpにコピー.
  3. echo -n "$issue_num" > $1 で,$1issue_numの値を代入.
  4. cat $1.tmp >> $1 で,$1の末尾に先程コピーしておいたもとのコミットメッセージの値を戻す.