December 11, 2012

もしGitHubに間違ったauthorとcommitterでpushしてしまったら。

GitHubに直接関係する話では有りませんが、GitHub絡みでよくやらかすので、メモしておきます。全コミットのauthorとcommitterを書き換える手順です。

globalなuser.nameが"xxx"
globalなuser.emailが"xxx@example.com"
で設定されているとします。

特定のレポジトリの
user.nameを"mamor"
user.emailを"mamor@example.com"
にするつもりが、設定を忘れて、前述のglobalなuser.nameとuser.emailでcommitしてGitHubにpushしてしまったら。何としてでも書き換えたくなります。

尚、この操作は、GitHub(というかbareレポジトリ)を複数人で使っている場合は絶対に行わないで下さい。もはや破壊行為です。また、一人で使っていても、複数端末でcloneしている場合は、ちょっと手こずるかもしれません。(authorとcommitterを書き換えた端末以外の端末では、cloneし直すのが手っ取り早いのかな。)

(1) 予め、globalなuser.nameとuser.emailを設定します。
$ git config --global user.name "xxx"
$ git config --global user.email "xxx@example.com"
(2) GitHubでレポジトリを作成して、cloneして、statusを見てみます。
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
(3) 適当に3コミットほどしてみます。
$ touch xxx.txt
$ git add xxx.txt
$ git commit -m "xxx"
[master (root-commit) 8541db6] xxx
 0 files changed
 create mode 100644 xxx.txt

$ touch yyy.txt
$ git add yyy.txt
$ git commit -m "yyy"
[master 7c73ecb] yyy
 0 files changed
 create mode 100644 yyy.txt

$ touch zzz.txt
$ git add zzz.txt
$ git commit -m "zzz"
[master 6dcfe97] zzz
 0 files changed
 create mode 100644 zzz.txt
本当はこの操作の前に
$ git config user.name "mamor"
$ git config user.email "mamor@example.com"
をすべきでした。という話です。

(4) logを見てみます。
$ git log
commit 6dcfe97230f09bc793175a5af1a15027292c53c2
Author: xxx <xxx@example.com>
Date:   Tue Dec 11 21:51:33 2012 +0900

    zzz

commit 7c73ecbc337361bca1af5d1722816666bd6b0d33
Author: xxx <xxx@example.com>
Date:   Tue Dec 11 21:51:11 2012 +0900

    yyy

commit 8541db609a8ee4c9797216ef131bb4699c66281c
Author: xxx <xxx@example.com>
Date:   Tue Dec 11 21:50:37 2012 +0900

    xxx
(5) pushします。
$ git push origin master
Password for 'https://mp-php@github.com':
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 548 bytes, done.
Total 7 (delta 1), reused 0 (delta 0)
To https://mp-php@github.com/mp-php/test.git
 * [new branch]      master -> master
(6) authorとcommitterを書き換えます。
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='mamor'; GIT_AUTHOR_EMAIL='mamor@example.com'; GIT_COMMITTER_NAME='mamor'; GIT_COMMITTER_EMAIL='mamor@example.com';"
Rewrite 6dcfe97230f09bc793175a5af1a15027292c53c2 (3/3)
Ref 'refs/heads/master' was rewritten
* もし、直近の2コミットのみを修正したい場合は"HEAD~2..HEAD"を末尾に付け足します。

(7) logを見てみます。全コミットのハッシュ値も変わっています。(4)とは全く別物です。
$ git log
commit 43b748b0386713e31bce00593991438204c981e0
Author: mamor <mamor@example.com>
Date:   Tue Dec 11 21:51:33 2012 +0900

    zzz

commit df224eaec1c14f6e352dbfc485bb781f3b98a357
Author: mamor <mamor@example.com>
Date:   Tue Dec 11 21:51:11 2012 +0900

    yyy

commit 9d74427602221a9c6711be91bf9029159b177e49
Author: mamor <mamor@example.com>
Date:   Tue Dec 11 21:50:37 2012 +0900

    xxx
(8) 強制pushします。
$ git push origin master -f
Password for 'https://mp-php@github.com':
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 551 bytes, done.
Total 7 (delta 1), reused 0 (delta 0)
To https://mp-php@github.com/mp-php/test.git
 + 6dcfe97...43b748b master -> master (forced update)

authorとcommitterの書き換え参考:
http://d.hatena.ne.jp/idesaku/20090908/1252419890
http://d.hatena.ne.jp/flalin/20110330/1301484566
http://d.hatena.ne.jp/naga_sawa/20110119/1295420861

authorとcommitterの違い参考:
http://d.hatena.ne.jp/shigemk2/20120310/1331314603

No comments:

Post a Comment