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年ぐらい知らずに使ってた…)

el.kulo 筆者

東京の某企業でフロント・エンド・エンジニアを務めています。デザイナーでもあります。 コラージュ作品を得意とし、写真や映像、音楽などクリエイトすることにジャンルを問わず興味を持っています。 HTML / CSS / JavaScript / PHP の実務歴は 15 年以上になります。 Githubのプロフィール