読者です 読者をやめる 読者になる 読者になる

成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

Gitのコミットメッセージを書き換えるフックをRubyで書いてみる

  • コミットメッセージにチケット番号を埋め込みたい!
  • チケット番号はブランチ名から判断してほしい

みたいな事、ありせんか?
僕はあります。

というわけで、コミットメッセージをいじるフックをRubyで書いてみたいと思います。

環境

  • MacOSX 10.8.3
  • Ruby 2.0.0p0 (アップデートしなきゃ、、、)
  • Git 1.8.2.3

手順

  1. 適当なリポジトリを作る
  2. フックを書く!
  3. コミットしてみる

すっごいシンプル。

適当なリポジトリを作る

$ mkdir hook-sample
$ cd hook-sample
$ git init
$ touch hoge
$ git add .
$ git commit -m "intialize"

とりあえず、hogeという空ファイルを作ってコミットしました。

フックを書く!

では早速フックを書いてみます。
今回はコミットメッセージを弄りたいので、
prepare-commit-msgフックを使います。
Git - Git フック

prepare-commit-msgフックは、コミットメッセージエディターが起動する直前、デフォルトメッセージが生成された直後に実行されます。

と、いうわけで、フック用のファイルを作ります。

$ touch .git/hooks/prepare-commit-msg
$ chmod +x .git/hooks/prepare-commit-msg

ここで、実行権限を付けておかないと、フックが起動しません。
(ここで、ちょっとハマる・・・)

では、中身を書きます。
今回は、前提として、

  • ブランチ名はチケット番号-XXXXとなっている
  • コミットメッセージは[チケット番号] コメント

とします。

#!/usr/bin/env ruby

current_branch = `git br | grep '*'`.chomp.sub('* ', '') # ①
if /^(\d+)-.*/ =~ current_branch
  commit_msgs = File.readlines(ARGV[0]) # ②
  open(ARGV[0], 'w') {|file|
    file.print "[#{$1}] " # ③
    file.puts commit_msgs
  }
end

まずは、①の部分で、現在のブランチ名を取得します。

次に、②の部分でコミットメッセージファイルの中身を読み込みます。
-mオプションでメッセージを指定している場合は、そのメッセージが入っていて、
エディタを立ち上げる場合は、デフォルトのメッセージが入ってます。

最後に③の部分で、メッセージの冒頭にチケット番号を挿入します。

やっている事は以上です。

コミットしてみる

ではコミットしてみます。

まずはチケット番号をつけたブランチを切ります。

$ git checkout -b 1234-hoge

hogeを編集します。

$ echo "hoge" >> hoge

コミットします。

$ git commit -am "modified hoge"
[1234-hoge 6f595df] [1234] modified hoge
 1 file changed, 1 insertion(+)

お、ちゃんとメッセージにチケット番号が入ってそうですね。
一応、ログを見てみます。

$ git log --oneline
6f595df [1234] modified hoge

入ってますね。

まとめ

  • gitのフックは、RubyだろうがPythonだろうがPerlだろうがなんでも書ける。
  • フックの引数で、コミットメッセージファイル名とか取得できる