Gitのコミットemailを書き換える

環境をいくつも使っていると設定を間違ってコミットしてしまうことがありますよね。
特に1台のPCに仕事とプライベートのリポジトリが混在してるとメール設定が間違っていたり・・・
こういうのは大抵だいぶ後に見つけてしまうのですが、Gitは過去のコミットログを修正できます。
まあ push -f するのは危険なので最初から気をつけるに越したことはないですけどね。

ここを参考にやってみました。

qiita.com

確認方法

1個目は正常。2個目間違ってる。。。

$ git log --pretty=fuller
commit xxxxxxxxxxd61e214a190a042f3416c5d85f4046 (HEAD -> master, origin/master, origin/HEAD)
Author:     GOZU Kenichiro <gozuk16@gmail.com>
AuthorDate: Sat Oct 31 13:13:20 2020 +0900
Commit:     GOZU Kenichiro <gozuk16@gmail.com>
CommitDate: Sat Oct 31 13:13:20 2020 +0900
 
commit xxxxxxxxxxd66b9169746acada7f8355e59d6d1c
Author:     GOZU Kenichiro <k.gozu@example.com>
AuthorDate: Fri Oct 30 13:13:21 2020 +0900
Commit:     GOZU Kenichiro <k.gozu@example.com>
CommitDate: Fri Oct 30 13:13:21 2020 +0900

emailを書き換え

指定するメールアドレスは変更後のものです。
履歴全部を書き換える場合、最後に HEAD を指定します。
ユーザ名も GIT_AUTHOR_NAMEGIT_COMMITTER_NAME で書き換えできますが、今回はメールアドレスだけ間違ってました。

$ git filter-branch -f --env-filter "GIT_AUTHOR_EMAIL='gozuk16@gmail.com'; GIT_COMMITTER_EMAIL='gozuk16@gmail.com';" HEAD
Proceeding with filter-branch...

Rewrite xxxxxxxxxxd61e214a190a042f3416c5d85f4046 (20/20) (0 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten

書き換えを確認

$ git log --pretty=fuller
commit xxxxxxxxxxd1218c7b6d2a96c57e0ca6f8776547 (HEAD -> master)
Author:     GOZU Kenichiro <gozuk16@gmail.com>
AuthorDate: Sat Oct 31 13:13:20 2020 +0900
Commit:     GOZU Kenichiro <gozuk16@gmail.com>
CommitDate: Sat Oct 31 13:13:20 2020 +0900
 
commit xxxxxxxxxx72d5d3b83a8df9c645508e3531787d
Author:     GOZU Kenichiro <gozuk16@gmail.com>
AuthorDate: Fri Oct 30 13:13:21 2020 +0900
Commit:     GOZU Kenichiro <gozuk16@gmail.com>
CommitDate: Fri Oct 30 13:13:21 2020 +0900

リモートリポジトリへpush

過去を改変した場合、 -f じゃないとpush出来ないのでチームで使ってるリポジトリはメンバーに確認してやりましょう。

$ git push -f
Enumerating objects: 83, done.
Counting objects: 100% (83/83), done.
Delta compression using up to 12 threads
Compressing objects: 100% (82/82), done.
Writing objects: 100% (83/83), 25.66 KiB | 3.67 MiB/s, done.
Total 83 (delta 46), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (46/46), done.
To https://github.com/gozuk16/testrepo
 + xxxx200...xxxxd73 master -> master (forced update)