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

コミットメッセージにgit issueのIDを入れるgit hookをつくった(Source Tree対応)

Git Issuesにはコミットメッセージに#1などIssue IDを入れておくことで、Pull Requestを出した際にCommitとIssueを紐付けてくれる機能がある。

ただ、いちいち自分でコミットメッセージにIssue IDを入れるというのは忘れてしまうので、git hooksで自動的に挿入されるようにしてみた。

コメントを差し込むことができるhookは以下の2つ

  • commit-msg
  • prepare-commit-msg

commit-msgはメッセージのバリデーションに、 prepare-commit-msgはデフォルトメッセージを準備するために使用されるようなので、 本来であればprepare-commit-msgを使用するのが正なものと思う。

ただプログラマに依って使うツールは様々で、仮にプロジェクト内にSource Treeを使用している人がいた場合、prepare-commit-msgはどうやらSourceTreeで未対応なため、hookの恩恵を受けることができないといった事態になってしまう。(僕はCLIなので全く問題はないが)

そこで今回はcommit-msghookでデフォルトコミットメッセージを挿入するgit hookを作った。

環境

仕様

仮にfeature/#1というブランチを切って作業してコミットした場合、コミットメッセージに#1が挿入される。

$ git checkout -b feature/#1
Switched to a new branch 'feature/#1'
$ git commit -m 'hoge' --allow-empty
hoge (#1)

実装

#!/usr/bin/env ruby
# frozen_string_literal: true
ID_REGEXP = /(?<issue_id>\#\d+)/

message_file = File.expand_path(ARGV[0])
message = File.read(message_file, encoding: Encoding::UTF_8)
current_branch = `git branch | grep '*'`.match(/\*\s(.+)/).captures.first

if ID_REGEXP =~ current_branch
  issue_id = Regexp.last_match[:issue_id]
  new_message = if message.include? issue_id
                  message
                else
                  "#{message}(#{issue_id})"
                end
  File.write(message_file, new_message)
end

説明

  1. ID_REGEXP#数字を抜き出す正規表現を適当に設定
  2. 標準入力からCOMMIT_MSGファイルの参照を抜き取り、そこからコミットメッセージを取得
  3. 現在のブランチを取得
  4. 正規表現を用いてissue IDを抜き出し、メッセージにIDが含まれて無ければ挿入する
  5. COMMIT_MSGに書き込む

以上!

prepare-commit-msgであればファイルに書き込むとかいらないのでもっと楽に作れたはず。

参考