« VivadoのJTAG書き込みではPAUSE DRステートを使う | トップページ | XILINXのUSER_ACCESSをJTAGで見る »

2018.11.14

Gitがファイルの日付を管理しない問題を何とかしたい(1)

gitで様々なプロジェクトを管理したいと思っているのですが、gitに上げて戻すと、ファイルの日付がcloneした日付に変わってしまいます。

これでは困ることがあります。

  • 目的のファイルがいつ頃作られたものなのかわからない
  • ファイルの更新日時でソートできなくなる
  • 長い間更新されていないファイルを探せなくなる
  • ファイルが更新されたかどうかをWindowsの機能だけで見つけられなくなる

Git2

確かに、ソースコードマネージメントの考え方から言えば、日付で管理したり比較するというのは邪道なのでしょう。

ブランチを切ったり、commitの際にコメントを付けろと言われそうですが、本当にそれで十分でしょうか?

ソースコードの更新履歴やコメントで辿るというのは素晴らしいことだとは思いますが、本当にそれだけで十分でしょうか。

コメントなんて最初は真面目に書いていても、そのうちtempとかtmptmpとか、hogeとかそんなものになっていくでしょう?ファイル名に"-最新"とか、"-20181113"とか付けるのと大して変わらない。

sun

ファイルの更新日時は、プロジェクトの中で目的のファイルがいつ頃に作業していたかとか、ファイルの作成された順序を教えてくれます。これは貴重な情報です。

それに、Windowsのエクスプローラに備わった一覧表示を見て、ファイルの更新の有無や、日付でソートできることの便利さは手放せません。わざわざgitというツールに頼らなければ何もわからないのは不便ではありませんか?

Git1

ちょっと探したいときに、毎度毎度GIT CMDでコマンドを打ちますか?

フォルダだけで見えるのは、最高。

だからgitの「日付は管理しない」というポリシーには頷けません。

sun

gitでcloneしたときに、日付が変わってしまって不便しているという人はほかにもいるようです。

1番目の方はcommitするときに日付を格納したファイルを別途作る方法で、2番目と3番目の方は、cloneしたファイルをスクリプトを使ってコミット時刻にまで戻す方法です。

gitはファイルの更新日時を保存していないのですが、コミット日時は保存しています。したがってせめて、コミットした日まで戻そうというわけです。

sun

ただ、これにも問題はあります。

新しいプロジェクトを作ってgitで管理するのならばそれでいいのですが、既に10年以上前からあるプロジェクトを今からgitで管理すると、すべてのファイルがfirst commitの時点(つまり、現在)のタイムスタンプになってしまうのです。

これではやはり困ることになります。

そこで考えたのが、「commitする時だけ、システムの時刻を過去に戻そう」というやり方です。

実際にツールを作ってみました。

Win32APIのFindFirstFileでディレクトリを再帰的に調べて、すべてのファイルを1つずつgit addして、時間を戻してからgit commitします。

ファイルの数だけcommitするので、commit回数がすごいことになります。

サンプルとして、RXマイコンにUSBで書き込むという2012年ごろのプロジェクトフォルダ一式をgit化してみました。

https://github.com/tokuden/rxprog

Git3

過去に作ったプロジェクトではありますが、ちゃんとcommit日時が過去を指すようになりました。

作ったプロジェクトをgithubに上げておきます。

https://github.com/tokuden/ttgac/

原理的には動作することが確かめられたので、

  • cloneやfetchしたファイルの日付をcommit日時に戻す機能
  • 前回のcommitから変更のあったファイルをaddしてcommitする機能
  • システムの日付全体を変更するのではなく、起動するgitだけ異なる日付で動くsandbox的な環境を作ること

などの機能を拡充していこうと思います。

特に3番目の機能は重要です。Windowsは裏で様々なバックグラウンドタスクが動いているので、システムの日付を変えるのは大変危険です。このツールを安全に利用するには、APIのフックを利用して、呼び出される子プロセス(git)からだけ過去の日付として見えるようにする方法が必須と思っています。

このツールはTrueTime Git Add and Commitなのでttgacという名前ですが、語呂が悪いのでgitttにしようかと思います。

sun

この考え方がgitユーザの皆様の逆鱗に触れれば幸いです。

|

« VivadoのJTAG書き込みではPAUSE DRステートを使う | トップページ | XILINXのUSER_ACCESSをJTAGで見る »

コメント

コメントを書く



(ウェブ上には掲載しません)




« VivadoのJTAG書き込みではPAUSE DRステートを使う | トップページ | XILINXのUSER_ACCESSをJTAGで見る »