gitのユーザ名やメールアドレスをコミット後に書き換える。

gitのユーザ名は、

git config --global user.name koseki
git config --global user.email koseki@example.com

のように設定しますが、設定を忘れてコミットしてしまった場合。さっきデフォルトの漢字のフルネームでコミットしてしまい、しかもgithubに出してから気づきました。ちょっと恥ずかしい。

どうせ始めたばっかりだったのでリポジトリを作り直してもよかったんですが、調べたらgit filter-branchで過去を書き換えることができました。

git filter-branch -f --env-filter 'export GIT_AUTHOR_NAME="koseki"'
git filter-branch -f --env-filter 'export GIT_AUTHOR_EMAIL="koseki@example.com"'

ここで-fオプションをつけないと、二度目に実行するときに

Namespace refs/original/ not empty

と怒られてしまいます。Namespace refs/originalというのは元の状態のバックアップ(参照)らしいです。上記のコマンドでは-fでバックアップを無視しています。

そこまではマニュアルに書いてあるんですが、バックアップを正しく消す方法は書いてません。rm -rfで.git/refs/original/を消すみたいな話は見つかりましたけど、もうちょっとマシなやり方があるだろう。と思ったので調べました。



コマンド名から探すと、

git show-ref

というのがありました。実行してみると参照の一覧らしきものが表示されます。

a1ce5437d45ae0e049e84ff69bd9e805fd2e4243 refs/heads/master
3370e1c3f75a112d697b0f72c509a4752e9050e0 refs/original/refs/heads/master
cea56fb72734da176d6eac816fcdcbae12edfa44 refs/remotes/origin/master

refs/original/で始まるパスを最後まで指定して、

git update-ref -d refs/original/refs/heads/master

で削除できました。filter-branchを実行して問題がなかったらupdate-ref -dを実行しておくと、たぶんいい感じになります。


一旦出しちゃったgithubのリポジトリは削除して作り直しました。originをremote rmで一旦消すことにします。

$ git remote
origin
$ git remote rm origin
$ git remote
$ git show-ref
3370e1c3f75a112d697b0f72c509a4752e9050e0 refs/heads/master

すっきり。