ファイルのタイムスタンプをコミット日時に合わせる

svnの場合は、 `use-commit-time = true` でコミットされた時間にファイルのmtimeを合わせることができる。

ここに記載する内容もほぼ全て、以下のページに記載されている。

- [checkoutしたファイルのmtimeを、そのファイルがcommitされた時刻に合わせたい ― svnとgitの場合 - (ひ)メモ](http://d.hatena.ne.jp/hirose31/20090106/1231171068)

gitの場合はそういうオプションはないので、スクリプトでサクッと対応することになるが、[公式wikiのサンプルスクリプト(perl)に記載がある](https://git.wiki.kernel.org/index.php/ExampleScripts#Setting_the_timestamps_of_the_files_to_the_commit_timestamp_of_the_commit_which_last_touched_them)わりに、それ自体がバージョン管理されていないという矛盾。（wikiなのでページ自体はバージョン管理されているけど…。このサンプルばかりを集めたリポジトリはない。ひょっとして[git自体](https://github.com/git/git)に含まれているかと思ったけれど、そんなことはなかった。）

あと、他のツールのサポートスクリプトとして収録されていることも多いみたいで、メジャーなところでは、[rsync](https://rsync.samba.org/)に[サポートスクリプトとして収録されている](https://git.samba.org/?p=rsync.git;a=tree;f=support;hb=refs/heads/master)。

そのため、上記wikiの記載をコピペするか、rsyncのサポートスクリプトを利用するか、というのが手っ取り早い。

## rsync付属の「git-set-file-times」の導入方法

### 既にrsyncがパッケージで導入されている場合など

rsyncがインストールされていれば、以下の手順で導入できるんじゃね、という。

```bash:コピー&nbsp;->&nbsp;展開&nbsp;->&nbsp;実行権限付与
cp -a /usr/share/doc/rsync/scripts/git-set-file-times.gz /usr/bin/
gzip -d /usr/bin/git-set-file-times.gz
chmod +x /usr/bin/git-set-file-times
```

- パッケージ由来なので、`/usr/bin` に入れるのが良いかな、と。
- ※ ソースコンパイルなどでそのままインストールしてるなら、 `/usr/local/share` の場合が多い。

### Gitで取ってくる場合

git用のスクリプトなんだからgitで取得すれば良いよね、という。

```bash:git&nbsp;clone&nbsp;->&nbsp;コピー&nbsp;->&nbsp;削除
git clone git://git.samba.org/rsync.git
cd ./rsync
./support/git-set-file-times
cp -a ./support/git-set-file-times /usr/local/bin/
cd ../
rm -fr ./rsync
```

- 別途導入してるんだから、 `/usr/local/bin` かな、と。

### curlで取ってくる場合

```bash:curlで放り込んで実行権限付与
curl -kLJR 'https://git.samba.org/?p=rsync.git;a=blob_plain;f=support/git-set-file-times' -o /usr/local/bin/git-set-file-times && chmod +x /usr/local/bin/git-set-file-times
```

## rsync付属の「git-set-file-times」を導入したときの問題。

~~以下のページで解説されている修正が、rsync版には適用されていない…。~~

- [git-set-file-times became to include merge commits. - heboi blog](http://nihen.hatenablog.com/entry/2012/10/06/022447)

~~もう何年も前の修正なのに…。~~

- rsync版がPython3で全面的に書き直されている。（@[2020-04-09](https://git.samba.org/?p=rsync.git;a=blob;f=support/git-set-file-times;h=6fe641a39e9a6d000bcf1abe9e2abff220278c37;hb=c5fabfb068bba9381c0f65fea60a99a62b681008)）
    - https://git.samba.org/?p=rsync.git;a=blob;f=support/git-set-file-times
    - https://github.com/WayneD/rsync/blob/master/support/git-set-file-times


## 結論

wiki掲載のサンプルをコピペするのがベスト。

どこかに公式的なファイルを置いて欲しい…。
あるいは、rsyncレベルのどこでも入ってるようなメジャーなツールで、上記の最新版を収録したものはないものか。

「コピペがベスト」だと、自動化しづらい…。


## Gitのコミットのタイムスタンプについて

- [Git のコミットのタイムスタンプには author date と committer date の 2 種類があるという話 - ひだまりソケットは壊れない](https://vividcode.hatenablog.com/entry/git/author-date-and-committer-date)
    - `git-set-file-times`で採用されているのはいずれも「committer date」になる。
        - 例えばGitHubで表示されるのはこの「committer date」の方で、こちらの方が後に更新されるのが常であるから、これを採用する、ということで良いのではないかとは思う。

## 追記@￰2017-04-03

[rsync版と、git公式wiki掲載版とで分岐進化をしてしまっている](http://b.hatena.ne.jp/entry/114230458/comment/rAdio)ようなので、自前でマージした。
https://gist.github.com/mAster-rAdio/642fff6acb79b7a587fb3bce7ee1c9ef


## 追記@￰2021-03-12

- 自分でマージしたGist版をさらに高速化してくれた方がいる。（@￰2020-06-18）
    - [ブログズミ: &#91;GIT&#93; 「ファイルのタイムスタンプをコミット日時に合わせる」を爆速にした](https://srz-zumix.blogspot.com/2020/06/git.html)
- ディレクトリのタイムスタンプを変更する「[git-set-folder-times](https://github.com/false-git/git-set-folder-times)」をPerlで作成された方がいる。（@￰2019-09-17）
- ShellScript版を作成されている方がいる。（@￰2015-03-20）
    - [コミット日付をタイムスタンプに復元したい - by shigemk2](https://www.shigemk2.com/entry/git.timestamp)
- C++版を作っておられる方もいた。速そう…。（@￰2018-10-18）
    - https://github.com/mochiya98/cpp_git-set-file-times