Gitのコミットログのname, emailを書き換える方法
本記事は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
は現在では公式から使用が非推奨になってます。
なので今回は、公式からgit filter-branch
の代替として推奨されている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. マッピングファイルを編集
作成したマッピングファイルを編集し、修正前の情報と修正したい内容をマッピングさせます。
記載方法によってマッピングの条件が変わります。
また、メールアドレスの記載には<...>
で囲う必要があります。
過去のコミットログのユーザー名、メールアドレスを指定して書き換える場合
new_name <new_email@example.com> old_name <old_email@example.com>
上記の例ではコミットログで現状記載されているユーザー名のold_name
とメールアドレスのold_email@example.com
に一致するコミットログを新しいユーザー名のnew_name
と新しいメールアドレスのnew_email@example.com
へ修正するようにマッピングされます。
過去のコミットログのメールアドレスを指定して書き換える場合
メールアドレスのみに一致したコミットログを新しいユーザー名、メールアドレスにマッピングしたい場合は下記のように記載します。
new_name <new_email@example.com> <old_email@example.com>
過去のコミットログのメールアドレスを指定してメールアドレスのみ書き換える場合
メールアドレスのみに一致したコミットログを新しいメールアドレスのみマッピングしたい場合は下記のように記載することもできます。
<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