👏

Gitのコミットログのname, emailを書き換える方法

2022/07/18に公開

本記事はGitで登録したユーザー名とメールアドレスを変更したいときの記事になります。
ただし、のちに記載する方法で過去のコミットログまで修正しようとすると、ハッシュ値が変わってしまいリモートブランチとコンフリクトしてしまいます。
リポジトリを共同で作業している場合、実施前には必ず確認をとってください。

コミットログのユーザー名とメールアドレス

Gitのコミットログにはコミットしたユーザーが設定したユーザー名とメールアドレスが含まれます。
例えばgit log --pretty=fullをすると下記のようにAuthorとCommitにユーザー名とメールアドレスが表示されます。

$ git log --pretty=full

commit 1c9a35753168789bf68866fb805098e68990089a (HEAD -> main)
Author: user_name <email@example.com>
Commit: user_name <email@example.com>

    Initial commit

ユーザー名とメールアドレスの設定の変更方法

このユーザー名やメールアドレスを変更したくなったときには下記コマンドで変更可能です。

$ git config --global user.name user_name
$ git config --global user.name email@example.com

または特定のリポジトリで変更したい場合はglobalではなくlocalで設定します。

$ git config --local user.name user_name
$ git config --local user.name email@example.com

この設定により、次からコミットした場合は設定した内容でコミットログに記録されます。
ただし、過去にコミットしたログは変更されないので別途作業が必要になります。

過去のコミットログの情報の変更方法

過去のコミットログの書き換え方法はgit rebase -iで書き換える方法やgit filter-branchで書き換える方法があります。

ただし、git rebase -iだと書き換える数が多くなると手間だったり、またgit filter-branchは現在では公式から使用が非推奨になってます。
https://git-scm.com/docs/git-filter-branch

なので今回は、公式からgit filter-branchの代替として推奨されているgit filter-repoで書き換えていきます。
https://github.com/newren/git-filter-repo

git-filter-repoとは

git-filter-repoはgitの履歴を書き換えるためのツールになります。
ドキュメントgit filter-branchとの対比のチャートシートがあるのでこちらを参考に実施していきます。

1. git-filter-repoをインストール

インストールはhomebrewなどのパッケージマネジャーからインストールできます。
私の場合はubuntuを使用していて、aptレポになさそうなのでpipからインストールしました。

$ pip3 install git-filter-repo

2. マッピングファイル(mailmap)の作成

ユーザー名やメールアドレスを書き換えるためのマッピングファイルを準備します。
作成場所は書き換えたいリポジトリ内でも良さそうですが、私の場合はそのファイルをコミットしないと設定が反映されなかったので、リポジトリ外に置きました。

$ touch mailmap

3. マッピングファイルを編集

作成したマッピングファイルを編集し、修正前の情報と修正したい内容をマッピングさせます。
記載方法によってマッピングの条件が変わります。
また、メールアドレスの記載には<...>で囲う必要があります。

過去のコミットログのユーザー名、メールアドレスを指定して書き換える場合

mailmap
new_name <new_email@example.com> old_name <old_email@example.com>

上記の例ではコミットログで現状記載されているユーザー名のold_nameとメールアドレスのold_email@example.comに一致するコミットログを新しいユーザー名のnew_nameと新しいメールアドレスのnew_email@example.comへ修正するようにマッピングされます。

過去のコミットログのメールアドレスを指定して書き換える場合

メールアドレスのみに一致したコミットログを新しいユーザー名、メールアドレスにマッピングしたい場合は下記のように記載します。

mailmap
new_name <new_email@example.com> <old_email@example.com>

過去のコミットログのメールアドレスを指定してメールアドレスのみ書き換える場合

メールアドレスのみに一致したコミットログを新しいメールアドレスのみマッピングしたい場合は下記のように記載することもできます。

mailmap
<new_email@example.com> <old_email@example.com>

4. 書き換えを実行

下記コマンドによりコミットログを書き換えます。
これによりコミットログがユーザー名とメールアドレスが新しいものに書きかえられます。

$ git filter-repo -f --mailmap <mailmapのpath>

5. リモートリポジトリに反映したい場合

gti filter-repoを使用すると誤ってリモートブランチに反映してしまうのを防ぐために、リモートブランチの登録が削除されてしまいます。
リモートブランチに反映させたい場合には登録し直してからforce pushを行います。
ただし、リポジトリを共同で作業している場合は書き換えた内容をpushして問題ないか確認をとってから実施しましょう。

$ git remote add origin git@github.com:<user name>/<repository>
$ git push -f origin main

# ローカルのすべてのブランチを書き換えたい場合は--allをつける
$ git push -f origin --all

Discussion