svnの場合は、 use-commit-time = true
でコミットされた時間にファイルのmtimeを合わせることができる。
ここに記載する内容もほぼ全て、以下のページに記載されている。
gitの場合はそういうオプションはないので、スクリプトでサクッと対応することになるが、公式wikiのサンプルスクリプト(perl)に記載があるわりに、それ自体がバージョン管理されていないという矛盾。(wikiなのでページ自体はバージョン管理されているけど…。このサンプルばかりを集めたリポジトリはない。ひょっとしてgit自体に含まれているかと思ったけれど、そんなことはなかった。)
あと、他のツールのサポートスクリプトとして収録されていることも多いみたいで、メジャーなところでは、rsyncにサポートスクリプトとして収録されている。
そのため、上記wikiの記載をコピペするか、rsyncのサポートスクリプトを利用するか、というのが手っ取り早い。
rsync付属の「git-set-file-times」の導入方法
既にrsyncがパッケージで導入されている場合など
rsyncがインストールされていれば、以下の手順で導入できるんじゃね、という。
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で取得すれば良いよね、という。
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で取ってくる場合
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版には適用されていない…。
もう何年も前の修正なのに…。
- rsync版がPython3で全面的に書き直されている。(@2020-04-09)
結論
wiki掲載のサンプルをコピペするのがベスト。
どこかに公式的なファイルを置いて欲しい…。
あるいは、rsyncレベルのどこでも入ってるようなメジャーなツールで、上記の最新版を収録したものはないものか。
「コピペがベスト」だと、自動化しづらい…。
Gitのコミットのタイムスタンプについて
-
Git のコミットのタイムスタンプには author date と committer date の 2 種類があるという話 - ひだまりソケットは壊れない
-
git-set-file-times
で採用されているのはいずれも「committer date」になる。- 例えばGitHubで表示されるのはこの「committer date」の方で、こちらの方が後に更新されるのが常であるから、これを採用する、ということで良いのではないかとは思う。
-
追記@2017-04-03
rsync版と、git公式wiki掲載版とで分岐進化をしてしまっているようなので、自前でマージした。
https://gist.github.com/mAster-rAdio/642fff6acb79b7a587fb3bce7ee1c9ef
追記@2021-03-12
- 自分でマージしたGist版をさらに高速化してくれた方がいる。(@2020-06-18)
- ディレクトリのタイムスタンプを変更する「git-set-folder-times」をPerlで作成された方がいる。(@2019-09-17)
- ShellScript版を作成されている方がいる。(@2015-03-20)
- C++版を作っておられる方もいた。速そう…。(@2018-10-18)