Gitのチェックアウトで更新日時を復元してみるテスト

最近Gitを使い始めたのだがVSSで育った世代としてはチェックアウト時に更新日時が新しくなるのがとても気持ち悪い。
何気なくチェックアウトしたら日時が今に変わってて昭和世代の人間は軽いパニックである。
なんとかしたいんだけどGitは更新日時についてはまるで無頓着らしく、VSS風の振る舞いにするには自前で更新日時を記録するしかないみたいだ。うーん。

ちょいと調べてみたらGitコマンドの前後にフックを入れて自前の処理を追加できるらしい。
ほほう、それなら力技でなんとかなりそう。
というわけで試しにやってみた。
シェルスクリプトだとちょっとめんどいのでデフォルトで入ってたperlで実装。
こんな感じ↓

  • pre-commit

#!/usr/bin/perl

$timestamps = ".timestamps";

foreach $file (`git diff --cached --name-only`) {
chomp($file);
$time{$file} = [(stat($file))[8, 9]];
}

open FILE, ">$timestamps" or die $!;

foreach $file (keys %time) {
print FILE join("\t", @{$time{$file}}, $file), "\n";
}

close FILE;

system("git add $timestamps");


  • post-checkout

#!/usr/bin/perl

$timestamps = ".timestamps";

exit unless -r $timestamps;

open FILE, "$timestamps" or die $!;

while(<FILE>) {
chomp;
($atime, $mtime, $file) = split(/\t/);
utime $atime, $mtime, $file or die $!;
}

close FILE;


とりあえず意図したとおり動いてる模様。
常にタイムスタンプ用のファイルも一緒にコミットされるのが邪魔といえば邪魔だけどまあそこは妥協しよう。
(ファイル名は外部設定にしても良いんだけどベタ書きの方が使いやすそうなのでこうしてます)
しばらくこれで使ってみよーっと。

[2016/03/17 追記]
Gitのドキュメント の「マージの戦略」にある感じでタイムスタンプ用ファイル(.timestamps)のコンフリクトを無視した方がよさげ。
でないとマージの時にタイムスタンプ用ファイルにどうでもいいコンフリクトが発生してめんどくさい。
<手順>
.git/info/attributesとかにこれ↓書いて、
.timestamps merge=ours
コマンドラインからドライバ登録。(事実上何もしないドライバを登録)
git config --global merge.ours.driver true


[PR]
by hogepiyo13 | 2016-03-15 17:26 | Git