cvs2git/cvs2svn 中的提交时间戳是如何生成的?

How are the commit timestamps generated in cvs2git/cvs2svn?

我正在通过 Cygwin 使用 cvs2git 将一个非常古老且庞大的 CVS 存储库转换为 Git。它工作正常,我开始测试新的存储库。我没有发现更大的特点。但我想知道 commit/change 集的时间戳是如何确定的。

到目前为止我确定,某些 CVS 修订之间的时间戳相差 1 或 2 小时加上 x,其中 x 是从几秒或几分钟(大多数情况)到两个 15 分钟的时间。许多时间戳仅相差整小时 (x=0)。

我想这与我发现的 "timestamp error correction" 是 cvs2svn 特性 (http://www.mcs.anl.gov/~jacob/cvs2svn/features.html) 有关。也可能跟时区有关。

我的测试结果显示,更改集中只有一个文件的所有提交都相差整整几个小时。这支持我的 "time zone hypothesis"。但这也让我想到了一个问题,即如何确定具有多个文件的更改集的时间戳。

我尝试查看代码并发现(在 Google 的帮助下)cvs2svn_lib 的 config.py 中有一个 "COMMIT_THRESHOLD"。我猜它是用来模糊 CVS 中基于文件的提交的。虽然代码看起来写的不错,但我对CVS、SVN和Git版本存储的技术了解不足,看不懂。

因此,如果有人能回答以下问题,我将不胜感激:

亲切的问候

编辑:

有人认为这个问题是"too broad",恐怕我的观点不够清楚。所以我想举一个具体的(虽然是虚构的)例子:

cvs2git 发现一个变更集有 3 个文件变更。他们在同一天提交(假设是 2016 年 2 月 30 日)。但他们的时代不同:

如果它只是文件 1,我认为 cvs2git 使用 2016-02-30T12:34:56 作为 Git 提交的时间戳。但是当所有 3 个文件的提交都属于一个更改集时,选择哪个时间戳?

与此相关,当我的存储库转换时,时间似乎也正好调整了 1 或 2 小时。当更改集中只有一个文件时,也会发生这种情况。我想这是某种时区调整。所以我想知道,为什么 "timestamp error correction" 更改了我的时间戳,以检查我是否接受这些更改。我对转换后的 Git 存储库进行了一些统计,原则上提交时间对我来说似乎没问题;但这对我来说还不够。

你问了两个问题:

  1. 如何为涉及多个文件的提交生成时间戳?

    对于修改文件的提交,cvs2svn/cvs2git 从构成提交的文件级提交中获取最新的时间戳。但是,如果该时间戳早于上一次提交的时间戳或转换时间后一天以上,则它会选择上一次提交后一秒的时间戳。

    对于涉及分支或标记的提交(CVS 根本不记录时间戳),时间戳设置为上次提交时间戳后一秒。

  2. 为什么时间戳有时会偏离整数小时?

    CVS 在不记录时区的情况下以 UTC 记录时间戳,并且 cvs2svn/cvs2git 按原样使用这些时间戳而不尝试猜测时区。所以时间戳应该是正确的,但以 UTC 表示。

    git log 有一个 --date 选项,可用于请求以当地时区显示日期。

cvs2svn 项目文件 doc/design-notes.txt 非常详细地记录了 cvs2svn/cvs2git 使用的算法。