ざこノート
2018-05-27 [Git]

[Git] 歴史上のCommiterとAuthorの名前とメールアドレスを変更する

git filter-branch –env-filterを使用して過去の情報を変更します。
無条件での一括変更、特定のメールアドレスを条件とした変更をする方法です。
--commit-filterは遅いようなので使用していません。

環境

  • Windows 10 Pro 64bit 1709
  • Git 2.17.1.windows.1

結果

全てのブランチを対象とする場合は、末尾のHEAD-- --allにして以下を実行します。

無条件に一括変更する

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='newName'; GIT_AUTHOR_EMAIL='new@localhost'; GIT_COMMITTER_NAME='newName'; GIT_COMMITTER_EMAIL='new@localhost';" --tag-name-filter cat HEAD

特定条件の場合のみ変更する

ある名前(メールアドレス)の場合のみ、新しい名前(メールアドレス)に変更してみます。
old@localhost -> new@localhost
oldName -> newName

メールアドレスで条件判定する例です。

git filter-branch -f --env-filter '
    if test "$GIT_AUTHOR_EMAIL" = "old@localhost"
    then
        GIT_AUTHOR_EMAIL="new@localhost"
        GIT_AUTHOR_NAME="newName"
    fi
    if test "$GIT_COMMITTER_EMAIL" = "old@localhost"
    then
        GIT_COMMITTER_EMAIL="new@localhost"
        GIT_COMMITTER_NAME="newName"
    fi' --tag-name-filter cat HEAD

個別に条件判定する例です。

git filter-branch -f --env-filter '
    if test "$GIT_AUTHOR_EMAIL" = "old@localhost"
    then
        GIT_AUTHOR_EMAIL="new@localhost"
    fi
    if test "$GIT_COMMITTER_EMAIL" = "old@localhost"
    then
        GIT_COMMITTER_EMAIL="new@localhost"
    fi
    if test "$GIT_AUTHOR_NAME" = "oldName"
    then
        GIT_AUTHOR_NAME="newName"
    fi
    if test "$GIT_COMMITTER_NAME" = "oldName"
    then
        GIT_COMMITTER_NAME="newName"
    fi' --tag-name-filter cat HEAD

確認方法

git log --pretty=full

# 確認する数を指定する (どちらでもOK)
git log --pretty=full -10
git log --pretty=full -n 10

リモートに強制プッシュ

git push -f

git push --tags -f

感謝