checkoutしたファイルのmtimeを、そのファイルがcommitされた時刻に合わせたい ― svnとgitの場合

唯一の中央レポジトリと複数のcheckoutするノードというトポロジの場合、checkoutしたファイルのmtimeがノード間で同じ時刻(当該ファイルがcommitされた時刻)になっているとなにかと都合がいいです。

例えば、Webアプリのデプロイを中央レポジトリからのcheckout(やupdate)で行う場合を考えます。もし、内容が同じなのに複数あるアプリサーバの間でmtimeが異なってしまっていると、

  • サーバごとにETagヘッダの値が異なってしまう
    • Apacheの場合、FileEtagディレクティブを調整(mtimeを見ないように)することによって統一可能ではあります
  • サーバ間でrsyncをかけると無駄なファイルコピーが発生する
    • 内容が同じににもかかわらずmtimeが異なるせいでコピーが発生する
    • ※--size-onlyオプションでmtimeを見ないようにして回避可能ではあります

ということが起こってしまいます。

そこで、checkoutしたファイルのmtimeをそのファイルがcommitされた時刻に合わせる方法を調べてみました。

svn

~/.subversion/configの[miscellany]セクションに

[miscellany]
use-commit-times = yes

と書けばOKです。

…というのをtypesterさんに教えてもらいました┌(。Д。)┐

git

あらかじめ、

にある git-set-file-times をローカルにコピペって実行できるようにしておきます。

で、git-cloneした後にそのディレクトリにcdして、さっきのgit-set-file-timesを実行します。

git-set-file-timesはgit-logの出力を元にモリっとmtimeを変更しまくります。