以前、GitHubのユーザー名とメールアドレスを変更したのだが、GitHubのリポジトリのコミット履歴のAuthor名とメールアドレスに古いものが含まれており、これを新しいものに変更したかったので調べてみた。

Author名とメールアドレスを一括変更

以下のコマンドで一括で変更できるらしい。

$ git filter-branch -f --env-filter \
  "GIT_AUTHOR_NAME='<new name>'; \
   GIT_AUTHOR_EMAIL='<new email>'; \
   GIT_COMMITTER_NAME='<new name>'; \
   GIT_COMMITTER_EMAIL='<new email>';" \
  <対象コミットリスト>

GitではAuthorの他にCommitterを記録しているのでこれも一緒に変更する。

対象コミットリストは、すべてのコミットが対象ならHEAD、対象を制限するならHEAD~20..HEADのように指定する。

実際に実行したコマンドは以下。

$ git filter-branch -f --env-filter \
  "GIT_AUTHOR_NAME='sohtaro'; \
   GIT_AUTHOR_EMAIL='sohtaro28@gmail.com'; \
   GIT_COMMITTER_NAME='sohtaro'; \
   GIT_COMMITTER_EMAIL='sohtaro28@gmail.com';" \
  HEAD

AuthorとCommitter両方を確認するためにgit log --pretty=fullを実行。
通常、AuthorとCommitterは同じだが`git commit –author=“Yamada Taro <yamada@example.com>“の形式でAuthor名を指定できる)

$ git log --pretty=full -1
commit 35afa51b289fff2403a6ecd0f3afce4e917034e0 (HEAD -> master)
Author: sohtaro <sohtaro28@gmail.com>
Commit: sohtaro <sohtaro28@gmail.com>

    Update public files

あっさり変更できた。

特定のAuthor名のコミットを変更

ところで上記のコマンドでは対象のコミットすべてが無条件に書き換えられるが、対象のコミットの中で特定の名前のみ書き換えたい場合は、以下のようにする。

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<old name>" ];
        then
                GIT_COMMITTER_NAME="<new name>";
                GIT_AUTHOR_NAME="<new name>";
                GIT_COMMITTER_EMAIL="<new email>";
                GIT_AUTHOR_EMAIL="<new email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' <対象コミットリスト>

参考サイト

GitのCommit中のAuthor名およびCommitter名を変える
git でメールアドレスやら名前やらを間違えて commit してしまったときの修正方法