ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

Gitの履歴内のユーザー名とメールアドレスを変更する方法

Gitでソース管理をしていますが、GitHub以外のリポジトリでもGitを使っている場合、ユーザー情報が異なる場合があります。
いろんな開発をしてると、流れでそのままコミットしてしまうので、意図しないユーザー情報でコミットしてしまうことがあります。
そんなときのユーザー情報の変更のやり方をまとめました。

古いやり方(filter-branch)

やり方を調べて、以下のコマンドを実行すると、警告文が表示されました。

git filter-branch --commit-filter '
  if [ "$GIT_COMMITTER_EMAIL" = "xxx@users.noreply.github.com" ];
    then
        GIT_COMMITTER_EMAIL="xxx@gmail.com";
        GIT_AUTHOR_EMAIL="xxx@gmail.com";
        git commit-tree "$@";
    else
        git commit-tree "$@";
    fi'  HEAD

WARNING: git-filter-branch has a glut of gotchas generating mangled history
         rewrites.  Hit Ctrl-C before proceeding to abort, then use an
         alternative filtering tool such as 'git filter-repo'
         (https://github.com/newren/git-filter-repo/) instead.  See the
         filter-branch manual page for more details; to squelch this warning,
         set FILTER_BRANCH_SQUELCH_WARNING=1.

filter-branch は壊れた履歴を生成する可能性があるため、filter-repo を使ってくれとのこと。

filter-repo のインストール

私の環境は、Macなのでbrewでインストールしました。

brew install git-filter-repo

新しいやり方(filter-repo)

新しいやり方は、filter-branch とは異なり少し事前準備が必要です。

1.名前と変更前後のメールアドレスを記載したファイルを作成する
ファイル名は何でも良いです。
中身は以下の形式で作成して下さい。

名前 <新しいメールアドレス> <古いアドレス(変更したいもの)>

例1:名前にブランクを含まない
yamada <xxx@gmail.com> <xxx@users.noreply.github.com>
例2:名前にブランクを含む(名前を""で括る)
"yamada taro" <xxx@gmail.com> <xxx@users.noreply.github.com>

2.filter-repo を実行します

git filter-repo -f --mailmap email.txt

3.ログで変更されているか確認する

4.pushする