hack のためのネタ帳, etc,,,

状況

git は基本的に、ワーキングコピーに展開したファイルのタイムスタンプを考慮しない。
例えば、 辺りを見ると、AuthorDate と CommitDate しか持ってないとか、
mtime を保存しない理由として とかが挙げられている。
要は、make とかで不整合が生じないように checkout 時の現在時刻を mtime に設定するってらしいんだけど、いや、それは make clean しないのが悪いんじゃね?っていう。

で、githooks で、クライアントサイドフックを用いて、.git/hooks/pre-commit で .timestamp にタイムスタンプを保存しておいて、.git/hooks/post-checkout で復元すれば、アドホックには対応出来そうなんだけど、Note に「特筆すべき点として、クライアントサイドフックはリポジトリをクローンする際には コピーされません 。 スクリプトを使って何らかのポリシーを強制したいのなら、サーバサイドで行う方がよいでしょう。サンプルが Git ポリシーの実施例 にあります。」みたいな注記が orz

これ、clone も含めて解決しようとすると、git commit をラップした ./git-commit みたいなの用意しておいて、commit はこれを使うようにするとかいう方法はあり得るかもしれないが、うっかり git commit で commit しちゃったりとかが防げない。

また、.timestamp にタイムスタンプを記録したとして、hook 経由しなかった場合に、これが更新されないので、古い .timestamp が適用されてしまう可能性が。

なら、コメント行とかに AuthorDate を記録しといて、git log のそれと比較して整合性を担保とか考えてみたが、レアケースではあるが、タイムスタンプの書き換えのような邪悪なことをすると、これも破綻してしまう。

いっそ .git/hooks/prepare-commit-msg でコミットメッセージに埋め込んでしまえば、commit と更新されなかった .timestamp という問題は生じないが、コミットメッセージが長くなるし、あまり体裁も良くないなぁと。
加えて言えば、コミットメッセージに # で始まらない行が入る事になるので、abort するには全部消して :wq とかしないといけなくなってちょっと面倒とか。

という事で、実装結果
amend するとちょっと面倒だなこれ。
replace するコード書くか?

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます