[Git] gitの歴史に残っているユーザー名やメールアドレスを書き換える

commit内に含まれる情報を書き換えます。

Contents

識別情報を書き換える

まず既存の情報を書き換えます。

% git config --global user.name "your_name"
% git config --global user.email your_email@gmail.com
% git config --list
user.name=your_name
user.email=your_email@gmail.com

GitHub.app や SourceTree.app の情報も忘れずに書き換えましょう。

git filter-branch

現状はこのようになっています。

% git show-ref
cc34ba95390fc5efca16b50dd75ade62f52652c1 refs/heads/master
cc34ba95390fc5efca16b50dd75ade62f52652c1 refs/remotes/origin/master

下記のようなコマンドとシェルスクリプトを実行します。

git filter-branch -f --commit-filter '
    GIT_AUTHOR_NAME="your_name"
    GIT_AUTHOR_EMAIL="your_email@gmail.com"
    GIT_COMMITTER_NAME="your_name"
    GIT_COMMITTER_EMAIL="your_email@gmail.com"
    git commit-tree "$@"
' HEAD

実行結果。

% git filter-branch -f --commit-filter '
quote>     GIT_AUTHOR_NAME="your_name"
quote>     GIT_AUTHOR_EMAIL="your_email@gmail.com"
quote>     GIT_COMMITTER_NAME="your_name"
quote>     GIT_COMMITTER_EMAIL="your_email@gmail.com"
quote>     git commit-tree "$@"
quote> ' HEAD
Rewrite c812ba092756390b292089aa2c975dda37dd2e0e (1/1)
Ref 'refs/heads/master' was rewritten

git push -f

git push するも reject されます。

% git push origin master
To git@github.com:your_name/zfSkelton.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:your_name/zfSkelton.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first merge the remote changes (e.g.,
hint: 'git pull') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

git push -f します。
この他に方法はないのだろうか?

% git push -f origin master
Counting objects: 27, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (20/20), done.
Writing objects: 100% (27/27), 5.51 KiB | 0 bytes/s, done.
Total 27 (delta 1), reused 27 (delta 1)
To git@github.com:your_name/zfSkelton.git
 + c29e059...dfe2749 master -> master (forced update)

確認してみると、確かにコミットのチェックサムが変わっています。

% git show-ref
2bc872815b6f65d39970497263e1bbac89252ea2 refs/heads/master
c812ba092756390b292089aa2c975dda37dd2e0e refs/original/refs/heads/master
2bc872815b6f65d39970497263e1bbac89252ea2 refs/remotes/origin/master

remotes も新しい設定に書き換わっています。

% git show 2bc872
commit 2bc872815b6f65d39970497263e1bbac89252ea2
Author: your_name <your_email@gmail.com>
Date:   Thu Aug 29 17:12:24 2013 +0900

バックアップを削除する

(おそらく必要があれば)
git filter-branch で作成されたローカルの refs/original を削除します。
現状、確認すると古い情報が見えました。

% git show c812
commit c812ba092756390b292089aa2c975dda37dd2e0e
Author: your_name_old <your_email_old>
Date:   Wed Jul 17 11:20:31 2013 +0900
    zf create skelton-project (Version: 1.12.3)
% git update-ref -d refs/original/refs/heads/master
% git show-ref
2bc872815b6f65d39970497263e1bbac89252ea2 refs/heads/master
2bc872815b6f65d39970497263e1bbac89252ea2 refs/remotes/origin/master

補遺

あわせて、メールアドレスを非公開にしておく。

% git filter-branch --tree-filter "find . -type f -exec sed -i '' -e '/PASSWORD/d' {} \;"