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