Git で直前のコミット日時を変更して GitHub の草を生やし続ける

GitHub の草を絶やさないための姑息な裏技。

git log --amend --date というコマンドで、直前のコミットの日時を変更できる。

$ git add sample.txt
$ git commit -m "サンプルのコミット。"
$ git log --pretty=fuller
commit a75cc……
Author:     Neos21 <mail@example.com>
AuthorDate: Wed Jul 13 00:07:05 2016 +0900
Commit:     Neos21 <mail@example.com>
CommitDate: Wed Jul 13 00:07:05 2016 +0900

上のように何らかのコミットを行ったあと、git log --pretty=fuller というコマンドを打つと、AuthorDateCommitDate という日付が見える。GitHub の Contributions、いわゆる「草」は、この内の AuthorDate を見て色付けを行っている。

この2つの日付は何なのかというと、コミットする内容を作った著者 (Author) の日付と、そのコミット情報を取り込んだ人 (Commiter) の日付を別々に持っているということらしい。

The author is the person who originally wrote the work, whereas the committer is the person who last applied the work.

さて、この AuthorDate さえ偽装できれば、GitHub で後から過去日に草を生やせるということだ。そのコマンドは以下。

# 先程のようなコミット直後に打つ。
$ git commit --amend --date="Mon Jul 11 12:00:00 2016 +0900"

$ git log --pretty=fuller
commit a75cc……
Author:     Neos21 <mail@example.com>
AuthorDate: Mon Jul 11 12:00:00 2016 +0900
Commit:     Neos21 <mail@example.com>
CommitDate: Wed Jul 13 00:07:05 2016 +0900

git commit --amend --date というコマンドで、直前のコミットの AuthorDate だけを書き換えた。--date="Mon Jul 11 12:00:00 2016 +0900" 部分で日時を指定している。ココを誤るとコミットに失敗するので、曜日含め正確に記入する必要がある。

うまくコミットできると、git log --pretty=fuller で見える AuthorDate が書き換わったことが分かるだろう。ちなみに通常 git log で閲覧できる日付は CommitDate の方なので、こちらで見ると何も変わっていないように見えるが平気。

この状態で git push で GitHub に Push してしまえば、それが過去日であろうと、GitHub Contributions に草が生やせる。

git commit --amend で操作するコミットの、さらに1つ手前のコミットよりも古い日付を指定したらどうなるのだろう。First Commit よりも過去日を指定したらどうなるんだろう。コミットログの順序と日付の整合が取れなくなるような操作は試していなくて、GitHub 上に既に Push してあるコミット履歴を改変するようなことをすると、git rebase なりしてマージしないといけなくなりそうな気がするので試していない。
普段誰も見ないようなどうでもいいリポジトリを作っておいて、草を生やしたいときだけどうでもいいコミットを作って日付改変して Push するのが安全だろうか。

しかし GitHub 上の表示仕様が変わって、Current Streak も見えなくなったし、今更みんな草の密集度合いとか気にしてないか。どうでもいいところに神経質で、上っ面だけでもキチッとしていたい人がいましたら、自己満足のためにドウゾ。

ツール化しました

シェルスクリプトでツール化してみましたのでよかったらコチラもドウゾ。

参考