Gitでコミットログのユーザ名を書き換える方法

そんなにいないかもしれないけど、プロダクトごとにいくつかのハンドルを使い分けている人は、gitプロジェクトごとに

git config --add user.name USER_NAME_FOR_THIS_PROJECT
git config --add user.email USER_EMAIL@FOR_THIS_PROJECT

とかやって、globalなユーザ名/メールアドレスと異なる個別の設定をしてることと思います。


で、プロジェクト作るときにこれをやってからコミットし始めれば良いんですが、既にいくつかglobalなユーザ名でコミットしてしまっている場合には、それらを書き換えたいですよね。


そういう場合は、

git rebase -i 書き換えたいコミットログ範囲の先頭コミットを指定(HEAD^とかHEAD~3とかkc3832kDとか)

git commit --amend --author=USER_NAME_FOR_THIS_PROJECT
git rebase --continue
....commitとrebase --continueを、指定したコミット範囲の分だけ繰り返す

のように実行すれば、順繰りとユーザ名を変更していけます。(もっと良い方法があるかもしれません)


ただし歴史改変にあたるので、既にgithubなどの公開リポジトリにpush済みであればもう一度公開リポジトリを作り直して、一からpushするなどをしないとだめですね。



あと、初期コミット直後にやろうとすると、新しいユーザ名が認識されずエラーになってしまいました。

$ git log
commit aaC0a88a2a6FBd93D0k081iDD3aDaa6774BAD1F1
author: nobeans <nobeans@example.com>
Date:   Thu Oct 8 09:59:35 2009 +0900

    initial import
$ git config --add user.name NEW_USER_NAME
$ git config --add user.email NEW_USER@example.com
$ git config --list
user.name=nobeans
user.email=nobeans@example.com
...(snip)...
user.name=NEW_USER_NAME
user.email=NEW_USER@example.com
$ git ci --amend --author=NEW_USER_NAME
fatal: No existing author found with 'NEW_USER_NAME'


で、結局ちょっとどうよという感じではありますが、以下の方法で回避できました。

  1. 一時ブランチを作る
  2. ファイルを1つ適当に編集して、コミットする
    • これで新しいユーザ名がgitに認識されたことになる!??
  3. 元のブランチに戻って、"git commit --amend --author=NEW_USER_NAME"を実行する
    • 成功する
  4. 一時ブランチを削除する


こういうものなんでしょうかね。