0

Cygwin経由でcvs2gitを使用して、非常に古くて巨大なCVSリポジトリをGitに変換しています。正常に動作し、新しいリポジトリのテストを開始しました。大きな特徴は見つかりませんでした。しかし、コミット/変更セットのタイムスタンプはどのように決定されるのだろうか。

これまでのところ、特定の CVS リビジョン間のタイムスタンプは、1 時間または 2 時間プラス x だけ異なると判断しました。x は、数秒または数分 (ほとんどの場合) から 2 15 分までの時間です。多くのタイムスタンプは、1 時間 (x=0) だけ異なります。

これは、cvs2svn 機能 ( http://www.mcs.anl.gov/~jacob/cvs2svn/features.html )であることがわかった「タイムスタンプ エラー修正」と何らかの関係があると思います。タイムゾーンも関係しているのかもしれません。

私のテストの結果は、変更セット内のファイルが 1 つだけのすべてのコミットが 1 時間も異なることを示しています。それは私の「タイムゾーン仮説」を支持します。しかし、それはまた、複数のファイルを持つ変更セットのタイムスタンプがどのように決定されるかという疑問にもつながります。

コードを調べてみたところ、(Google の助けを借りて) cvs2svn_lib の config.py に「COMMIT_THRESHOLD」があることがわかりました。これは、CVS 内のファイル ベースのコミットをまとめてファジングするために使用されると思います。コードはうまく書かれているように見えますが、CVS、SVN、および Git リビジョン ストレージの技術的な理解が不足しているため、理解するのが困難です。

したがって、誰かが次の質問に答えてくれれば幸いです。

  • cvs2svn/cvs2git は、複数のファイルを持つ変更セットのコミット タイムスタンプをどのように決定しますか?
  • 「タイムスタンプ エラー修正」cvs2svn/cvs2git はどのように機能しますか? (私にとっては、技術的な背景よりも機能的な背景の方が重要です。)

敬具

編集:

誰かがこの質問を「広すぎる」と考えたので、私は私の主張を十分に明確にしなかったことを恐れています. だから私は具体的な(フィクションですが)例を挙げたいと思います:

cvs2git は、1 つの変更セットに対して 3 つのファイル変更を検出しました。それらは同じ日にコミットされた場所です (2016 年 2 月 30 日としましょう)。しかし、それらの時間は異なります。

  • ファイル 1: 12:34:56
  • ファイル 2: 12:35:38
  • ファイル 3: 12:36:09

ファイル 1 のみの場合、cvs2git は 2016-02-30T12:34:56 を Git コミットのタイムスタンプとして使用すると思います。しかし、3 つのファイルすべてのコミットが 1 つの変更セットに属している場合、どのタイムスタンプが選択されるのでしょうか?

これに関連して、リポジトリが変換されると、時間も正確に 1 時間または 2 時間調整されるようです。これは、変更セットにファイルが 1 つしかない場合にも発生します。ある種のタイムゾーン調整だと思います。したがって、「タイムスタンプのエラー修正」によってタイムスタンプが変更された理由を知りたいので、これらの変更を受け入れるかどうかを確認してください。変換された Git リポジトリについていくつかの統計を行いましたが、コミット時間は原則として問題ないようです。しかし、それだけでは十分ではありません。

4

1 に答える 1

2

次の 2 つの質問をします。

  1. 複数のファイルに触れるコミットのタイムスタンプはどのように生成されますか?

    ファイルを変更するコミットの場合、cvs2svn/cvs2git は、コミットを構成するファイル レベルのコミットの中から最新のタイムスタンプを取得します。ただし、そのタイムスタンプが前回のコミットのタイムスタンプよりも古い場合、または変換時刻から 1 日以上経過している場合は、代わりに前回のコミットの 1 秒後のタイムスタンプが選択されます。

    分岐またはタグ付けを含むコミット (CVS がタイムスタンプをまったく記録しないもの) の場合、タイムスタンプは前のコミットのタイムスタンプの 1 秒後に設定されます。

  2. タイムスタンプが整数時間ずれることがあるのはなぜですか?

    CVS はタイムゾーンを記録せずにタイムスタンプを UTC で記録し、cvs2svn/cvs2git はタイムゾーンを推測せずにそれらのタイムスタンプをそのまま使用します。したがって、タイムスタンプは正しいはずですが、UTC で表されます。

    git logには、--date日付をローカル タイムゾーンで表示するように要求するために使用できるオプションがあります。

cvs2svn プロジェクト ファイルdoc/design-notes.txtには、cvs2svn/cvs2git で使用されるアルゴリズムが詳細に記述されています。

于 2016-10-13T06:32:38.733 に答える