Gitにはコミットした時の git config のユーザ名とメールアドレスが残る。
初めてGitをPCにセットアップするときにはグローバルの git config の設定に user.name と user.email を追加すると思います。特定のプロジェクトではグローバルの git config に設定されたのとは別の名前とメールアドレスに変えたかったので調べてみた。
さらに、既にコミットしてしまった過去の記録を変える方法を探る。Gitの過去の改竄は複数人が関わるプロジェクトでは支障が出る場合があるので自己責任で!
まずはログを確認
git log --all --pretty=full --graph
このコマンドで次の情報がcommitと一緒に残されているのが分かる。
- Author Name
- Author Email
- Committer Name
- Committer Email
過去のGitログを書き換える
git filter-branch --force --env-filter '
if [ "$GIT_AUTHOR_NAME" = "変更前の user.name" ];
then
GIT_AUTHOR_NAME="変更後の user.name";
fi
if [ "$GIT_COMMITTER_NAME" = "変更前の user.name" ];
then
GIT_COMMITTER_NAME="変更後の user.name";
fi
if [ "$GIT_AUTHOR_EMAIL" = "変更前の user.email" ];
then
GIT_AUTHOR_EMAIL="変更後の user.email";
fi
if [ "$GIT_COMMITTER_EMAIL" = "変更前の user.email" ];
then
GIT_COMMITTER_EMAIL="変更後の user.email";
fi
' -- --all
変更を確認
git log --all --pretty=full --graph
リモートに反映
反映前にfetchすると変更前にもどるので注意。
git push --all --force origin
ローカルGitには改竄履歴が残る
ローカルのGitには変更した履歴がちゃんと残っているので、ログを辿ると変更前のメールアドレスだったコミット記録も確認できる。
git log --all --pretty=full --graph
ローカルだけなので消す必要はないが、気になるならgit clone
し直せば当然消えます。git clone
しなくても完全に消す方法はあるようだけど、Git公式でも推奨されてないようなのでgit clone
で新しいローカルリポジトリにした方が安全。
git clone xxxx.git
特定のプロジェクトだけ user.email と user.name を変更
git config の優先順について
git config は system、global、local の設定がある。プロジェクトルートにある .git ディレクトリにある config に設定されるのが local です。
優先順位は local > global > system となっています。
local に設定があれば最優先。そのプロジェクトだけ変える場合だけ設定すればいい。
git config --local --list
ローカル設定の変更
これ以降のコミットでこの設定が適用される。
git config --local user.email "mail@example.com"
git config --local user.name "My Name"
ちなみに、Githubならhttps://github.com/settings/emails の 「Keep my email address private」をオンで、USERNAME@users.noreply.github.com の形のダミーのアドレスを発行できる。
(初めの1年ぐらい知らずに使ってた…)