gitログのauthorとcommiterをまとめて修正する

誤ったアカウントでgitコミット/プッシュしてしまい、ログ修正に対応した。
日本語のサイトで情報をあまり見かけなかったので、備忘も兼ねて。

経緯

  • リポジトリによって2つのGitアカウントを使い分けていた
  • 誤ったアカウントでリポジトリに大量にコミットしていたことに気付く
  • 過去ログまで遡って全てのコミッタ情報を修正したいが日本語でコレという情報がなかなか見つからない

方法

  1. ターミナルを開く(Windowsの場合はgit bashでおk)
  2. 対象リポジトリのルートディレクトリに移動
  3. vi等で下記シェルスクリプトを作成
    #!/bin/sh
    
    git filter-branch --env-filter '
    OLD_EMAIL="your-old-email@example.com"
    CORRECT_NAME="Your Correct Name"
    CORRECT_EMAIL="your-correct-email@example.com"
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_NAME="$CORRECT_NAME"
        export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_AUTHOR_NAME="$CORRECT_NAME"
        export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    fi
    ' --force --tag-name-filter cat -- --branches --tags

    “your-old-email@example.com” は「このアドレスにマッチしたら」の条件になるので、修正前の誤ったアドレスで上書きしてください

    “Your Correct Name” “your-correct-email@example.com” はそれぞれ修正後の正しい名前とアドレスに上書きしてください

    ※基本的にauthorとcommiterは同じ名前、メールアドレスで問題ないはずだけど、もし個別に設定したい場合は

    #!/bin/sh
    
    git filter-branch --env-filter '
    OLD_EMAIL="your-old-email@example.com"
    CORRECT_NAME_COMMITER="Your Correct Name for commiter" 
    CORRECT_EMAIL_COMMITER="your-correct-email-for-commiter@example.com" 
    CORRECT_NAME_AUTHOR="Your Correct Name for author" 
    CORRECT_EMAIL_AUTHOR="your-correct-email-for-author@example.com"
    
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_NAME="$CORRECT_NAME"
        export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_AUTHOR_NAME="$CORRECT_NAME"
        export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    fi
    ' --force --tag-name-filter cat -- --branches --tags

    という感じで個別に設定してください

  4. 上記スクリプトを実行
    sh fixAuthorCommitter.sh
  5. 修正後のログを確認
  6. 問題なければリモートにpush ※要force push
    git push --force
  7. 完了

補足

同リポジトリの共同作業者がいる場合、そちらでpullした際にログがおかしくなる。(共同作業者側のローカルとリモートで差分がある状態からpullするので、共同作業者のローカルでマージしたような形になる)

ので、pull後にgit reset –hard origin でリモートと同期した状態に戻すか、cloneし直す必要あり。

最後に

もしあなたの他にリポジトリで作業している共同作業者がいる場合、基本的にリモートにpush済みのコミットログを書き換える行為は末代まで祟られる最低の行為です。(懺悔)

必ず事前に共同作業者に相談した上で用法を守って正しくお使い下さい。

ではでは。

Leave a Reply

Your email address will not be published. Required fields are marked *