Pocket

Repositoryを作成し運用しているなかで、
「初期コミットしたときのユーザー名(以下、Author)間違ってた・・・」なんてことはありませんか?

私はあるんですけどね。

Author を変更したいときは git rebase を使うようですが、
これだと初期コミットの Author の変更は出来ないじゃん。

この場合は git filter-branch

例えばこんなリポジトリ。

*       nemoto  2167350  (HEAD, origin/feature/4, origin/develop, develop) fixed. #4
| *     nemoto  d722b14  (origin/feature/3) fixed. #3
|/
*       nemoto  b57f51f  (origin/master, origin/HEAD, master) Merge branch 'feature/1' into develop
|\
| *     test    a6ece0e  (origin/feature/1) fixed. #1
* |     test    3999afb  (origin/feature/2) fixed. #2
|/
*       test    b2d523a  initial commit

間違った Author を変更したい場合 (test→nemoto) には以下、

git filter-branch --commit-filter '
GIT_AUTHOR_NAME="nemoto"
git commit-tree "$@"
' HEAD

このコマンドで Author を変更すると、

*       nemoto  2167350  (origin/feature/4, origin/develop) fixed. #4
| *     nemoto  d722b14  (origin/feature/3) fixed. #3
|/
*       nemoto  b57f51f  (origin/master, origin/HEAD, refs/original/refs/heads/master) Merge branch 'feature/1' into deve
|\
| *     test    a6ece0e  (origin/feature/1) fixed. #1
* |     test    3999afb  (origin/feature/2) fixed. #2
|/
*       test    b2d523a  initial commit
*       nemoto  77819b1  (HEAD, master) Merge branch 'feature/1' into develop
|\
| *     nemoto  3f46706  fixed. #1
* |     nemoto  c378747  fixed. #2
|/
*       nemoto  1584fd3  initial commit

こんな感じになるので、 git push -f してあげると、

*       nemoto  2167350  (origin/feature/4, origin/develop, develop) fixed. #4
| *     nemoto  d722b14  (origin/feature/3) fixed. #3
|/
*       nemoto  b57f51f  (refs/original/refs/heads/master) Merge branch 'feature/1' into develop
|\
| *     test    a6ece0e  (origin/feature/1) fixed. #1
* |     test    3999afb  (origin/feature/2) fixed. #2
|/
*       test    b2d523a  initial commit
*       nemoto  77819b1  (HEAD, origin/master, origin/HEAD, master) Merge branch 'feature/1' into develop
|\
| *     nemoto  3f46706  fixed. #1
* |     nemoto  c378747  fixed. #2
|/
*       nemoto  1584fd3  initial commit

このように “initial commmit” のユーザー名が変更されます (commit id = 1584fd3)

ちなみに以前の “initial commit” (commit id = b2d523a) が残っているのは、そこから派生した branch 等が存在している為。
該当branchを(不要なら)消す。
または、そのbranchに git checkout して同様に git filter-branch することで、(派生するbranchがなくなった時点で)消えます。

但し、commit-idが、再度振り直されてしまうので、それが許容できるなら・・・。

あー。最初から間違えないのが一番か!


条件式で指定することも可

git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_NAME" = "test" ]; then
  GIT_AUTHOR_NAME="nemoto"
fi
git commit-tree "$@"
' HEAD

Author以外も可

git filter-branch --commit-filter '
GIT_AUTHOR_NAME="nemoto"
GIT_AUTHOR_EMAIL="nemoto@example.com"
GIT_COMMITTER_NAME="nemoto"
GIT_COMMITTER_EMAIL="nemoto@example.com"
git commit-tree "$@"
' HEAD