SourceTreeでブランチ名をコミットメッセージの先頭に自動挿入

このエントリーをはてなブックマークに追加

Git便利ですね。今やこれ無しで開発は無理、というレベルです。

そんな日々使っているGitですが、何かしらのツールでタスクやIssueを作ってそのIDをfeatureブランチ名としている運用は多いと思います。

その場合、コミットメッセージにそのIDが含まれているとコミットとタスクを紐づけてくれるので、コミットメッセージの先頭にブランチ名を挿入することが多いはずです。

それを打つのが一々面倒だしたまにミスして違うタスクに紐付かれちゃうし、で少し困っていました。

コマンドラインで作業している場合は、以下のようなにGitのprepare-commit-msgフックを利用することで、コミットメッセージ作成時に自動挿入させることが可能です。

ただ、SourceTreeで試そうとしたら、動いてくれず、調べたところ非対応のようです。

@yabuchin_yさんに相談したら、commit-msgで書き換えてしまえばいけるのでは?ということで作ってもらえました。

(僕はこの時点で、commit-msgはバリデーションフェーズ的なもので、書き換えは不可能なのでは?と思って諦めてしまいそうでした。)

設定手順

コミットメッセージのテンプレートを作成して指定の文章が自動挿入されるようにする

以下を、特定のレポジトリルートで実行。

# $HOME/.gitmessage.txtの置き場所は自由です
# グローバルな設定としたい場合は、--globalオプションを付ける
git config commit.template $HOME/.gitmessage.txt
# .gitmessage.txtの中身(末尾に半角スペースを入れておくこと推奨)
[branchname]

これで、コミットメッセージ作成時に、[branchname] が先頭に自動挿入されます。

コミット後に[branchname]がブランチ名へ書き換えられるようにする

commit-msgフックを利用します。

以下を特定のレポジトリの.git/hooks/commit-msgとして配置します。

#!/usr/bin/env ruby
message_file = ARGV[0]
message = File.read(message_file, :encoding => Encoding::UTF_8)

current_branch = `git branch | grep '*'`.chomp.sub('* ', '')
current_branch = current_branch[current_branch.rindex("/")+1 .. current_branch.length]

newmessage = message.sub(/\[branchname\]/, current_branch)

File.write(message_file, newmessage)

feature/hoge/#35などとなっている場合、[branchname]部分が#35と置換されるような処理をしています。 用途に応じて適宜書き換えてください。

挙動

文章だけではイメージが沸きにくいかもしれないので、スクリーンショット貼っておきます。

コミットメッセージを入れようとすると先頭に[branchname]が自動挿入

そのままその後にメッセージを入れてコミットします。

[branchname]が置換されてブランチ名になってくれます

実際に使って見て

先週から活用し初めましたがすこぶる快適です( ´・‿・`)

@yabuchin_yさん、ありがとうございました( ´・‿・`)

参考リンク