Gitのcommitメッセージに定型文をぶっ込む

Gitのcommitメッセージに定型文をぶっ込みたいときがある.例えば$defaultのような環境変数が設定されていて,それを自動でcommitメッセージに含めるようにしたいとする.

以下のようなaliasを設定する.

[alias]
    cmd = "!f () { git commit -m \"$1 ($default)\" $2;}; f"
$ export default="default message"
$ git cmd "Some changes" # -> git commit -m "Some changes (default message)"

f()という関数を定義してそれを最後に実行する.こんな回りくどいやり方をするのは,gitのaliasが最後に"$@"をつけてサブコマンド以外の引数をすべて展開するためで,単純に$1で第一引数を取得して…では期待通りにはならない.関数定義して最後にそれを実行すれば,gitがつける"$@"をその関数の引数として使える.

自分のチームだとStashとJIRAを使っていて,JIRAのチケット名をcommitメッセージに含めるとStash上でJIRAのIssueとリンクされる.慣習としてbranch名とJIRAのチケット名を同じにしているので,ブランチ名をcommitメッセージに含めることができれば少し楽.

例えば,JIRAのissueの名前がxxx-1456とするとこんな感じのことをする.

$ git checkout -b xxx-1456
(Some changes)
$ git commit -m "Some changes (xxx-1456)" 

以下ようなaliasを設定すれば,自動でブランチ名を最後に含めたcommitメッセージが作られる.

cmb = "!f () { git commit -m \"$1 ($(git branch -a | grep '^*' | cut -b 3-))\" $2;}; f"
$ git checkout -b xxx-1456
(Some changes)
$ git cmb "Some changes" # -> git commit -m "Some changes (xxx-1456)"

かなり希有なパターンだけど,他にも応用できるかなと.ちなみにexport GIT_TRACE=1すると,gitが何やってるのか細かく見れるので複雑なaliasを作るとき便利.

ついでによく使ってる,ちょっとマイナーなaliasをいくつか.まず,Initial commitを一気にやる,git this

this = !git init && git add . && git commit -m \"Initial commit\"

.gitignoreにファイルを追加する,git ignore FILE

ignore = "!ignore () { echo $1 >> .gitignore;}; ignore"

aliasを全部表示する,git alias

alias  = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1\\ => \\2/' | sort

参考