GitのCommit中のAuthor名およびCommitter名を変える
ローカルで持っているGitリポジトリをGitHubにpushしてしまいたいなぁ、と思ったのだが、pushする直前にAuthorおよびCommitterとして自分の本名を使っていることに気づいた。そういえば、Gitを使い始めたころはuser.nameに正直に本名を入れていたなぁ…。
そのままでも大した問題はないのだが、ネット上ではidesakuで通すことにしているので、こいつらを修正した。その際、あまり使わないコマンドを使ったので、作業ログなど残してみる。
さて、どうすればよいか。すぐに思いついたのは、git-rebaseを使うことである。
ところで、Gitは全てのコミットにAuthorとCommitterの二つの名前を記録している。これは、オープンソース分野でよくある「パッチを書いた人(Author)と、それをリポジトリにコミットした人(Committer)が違う」ケースに対応するための措置である。*1
git-rebaseだとこのうちCommitterしか変更できない*2。そもそも、git-rebaseでは最初のコミットを変更できない。
…どうしよう?
http://progit.org/book/ch6-4.htmlによると、git-filter-branchを使うと良いらしい。ということで、次のようなコマンドを実行してみた。*3また、名前だけでなくemailも古かったので、ついでに変更した。
$ git filter-branch --commit-filter '
GIT_AUTHOR_NAME="idesaku"
GIT_AUTHOR_EMAIL="(メールアドレス)"
GIT_COMMITTER_NAME="idesaku"
GIT_COMMITTER_EMAIL="(メールアドレス)"
git commit-tree "$@"
' HEAD実行してみたところ、無事変更できた。
--commit-filterの後に、Commitを操作するためのシェルスクリプトを書いている。俺の場合は全てのCommitのAuthorとCommitterを同様に変更すればよいため、これだけシンプルになった。
操作するCommitを選択したい場合、例えば複数人で使用しているリポジトリで、特定の人物によるCommitのみ変更したい、といった場合は、次のように書く必要があるだろう。
$ git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "old_name" ]; then
GIT_COMMITTER_NAME="new_name"
fi
git commit-tree "$@"
' HEADユーザを特定する条件には、GIT_COMMITTER_NAMEの他にも、例えばGIT_COMMITTER_EMAILを使ってもいいかもしれない。