最近自分の関わっているプロジェクトではgitのブランチに issues/XXXX-description-of-branch という名前を付ける慣習になっている。
issues/XXXXの部分をコピーして貼り付ければredmineのURLに貼り付けて開けるため。
redmineと言えば、コミットメッセージにrefs #XXXX
と書けばチケットと紐付いたりしてくれるのだが、これを書くのを毎回忘れるので、issues/XXXXというブランチにいたら自動的にコミットメッセージに含めてくれるようにした。
こちらのブログを参考にして改造した。
#!/bin/sh
# .git/hooks/prepare-commit-msg に置いて実行権限をつける
# git rev-parse --abbrev-ref HEAD は現在のブランチ名を出力するが、rebase中だとHEADになったりする
issue="`git rev-parse --abbrev-ref HEAD | grep "issues/[0-9]\+" | perl -pe 's%^issues/([0-9]+).*%$1%'`"
case "$2,$3" in
merge,)
/usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1"
;;
message,)
if [ "$issue" != "" ]; then
echo "refs #$issue" >> $1
fi
;;
,)
if [ "$issue" != "" ]; then
mv $1 $1.tmp
echo $'\n\n'"refs #$issue" >> $1
cat $1.tmp >> $1
fi
;;
*)
;;
esac
.git/hooks/prepare-commit-msg の引数の$1はコミットメッセージの入ったファイル名が入る。$2は、git commit -m だと"message"になり、エディタが開かれる場合は空になる。rebase -iして自動でコミットを継ぎ足している間も空文字になるので、この場合は無視しないといけない。