ほとんどの状況で Git Author と Committer はグローバルで設定しておけば足りるのだけれど、特定のリポジトリらでだけそれらを切り替えたくて、でもそれを忘れるのでコミットメッセージに Author と Committer を表示して気づけるようにした。
#!/usr/bin/env bash
# Prepends author and committer lines to the message
AUTHOR_LINE="$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Author: \1/p')"
COMMITER_LINE="$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Committer: \1/p')"
sed -i "0,/^#/s//# ${AUTHOR_LINE}\n# ${COMMITER_LINE}\n#/" "$1"
これは githooks を使って、prepare-commit-msg
のタイミングで Author と Committer をコメント文として先頭に追加している。template 機能を使ってそれぞれのリポジトリの .git/hooks/prepare-commit-msg
として上記のスクリプトを置いておけば動作する。template はいくつか設定方法があるので下記ドキュメントの中から都合のよいものを選択すればよい。
また既に存在するリポジトリにはスクリプトを配布しないといけない。$HOME/.git-template
を template ディレクトリとしており、ghq を使っているなら以下のように配布すればよい。
$ find "$GHQ_ROOT" -name .git -type d -d 4 | xargs -I {} cp "$HOME/.git-template/hooks/prepare-commit-msg" {}/hooks/
当初は pre-commit
のタイミングで GIT_AUTHOR_EMAIL
環境変数を書き換えるようにしようとしたのだけれどうまく機能しなかったので表示して気づけるところに落ち着いた。
追記 Tue Dec 13 11:43:52 JST 2016
git commit --amend
などコミットメッセージが存在する状況で正しく動作しなかったため、正確にコメント文の先頭に追記されるようにスクリプトを修正しました。