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
すっきり。