如果我理解正确,您想要一种方法来回答“包含文件 FOO 的 CVS 修订 X.Y 的第一个 Git 提交是什么?”这个问题。
如果您打开 cvs2git 详细输出 ("-v"),则 cvs2git 在 CreateRevsPass 期间显示正在添加到每个 Git 提交的 CVS 文件修订:
CVS Revision grouping:
Time: Fri May 23 02:31:36 2003
Creating Subversion r23 (commit)
proj/default 1.2.2.1
proj/sub1/default 1.2.2.1
proj/sub2/subsubA/default 1.1.2.1
这与您想要的很接近。但是生成表的信息还不够,因为没有简单的方法可以将伪 Subversion 修订号(如“r23”)映射到 Git 提交哈希。事实上,这并非微不足道,因为 cvs2git 本身并不创建 Git 哈希,而只是将它们以抽象形式写入“git fast-import”,它会创建提交并计算它们的哈希。
告诉你我要做什么......
我刚刚对 cvs2svn 的主干版本进行了更改,这导致 OutputPass 发出更多信息,即哪个“标记”对应于哪个伪 Subversion 修订号。上述提交的输出如下所示:
Writing commit r23 on Branch('B_MIXED') (mark :1000000021)
反过来,可以通过要求“git fast-import”将其标记写入文件来将标记“:1000000021”转换为 Git SHA-1:
cat ../git-blob.dat ../git-dump.dat | git fast-import --export-marks=FILENAME
在结果文件中查找如下所示的一行:
:1000000021 0aa255270fbb94ad691d5391a6d37c2ee6d78b03
您可以从中读取 Git 哈希。
您仍然需要做一些工作才能将所有这些信息汇总在一起,但现在至少原则上应该是可能的。
请注意,此方法只会告诉您包含 CVS 文件修订的第一个 Git 提交。它不会告诉您该文件修订何时合并到其他分支。事实上,由于 CVS 和 Git 之间的阻抗不匹配,你不能依赖 Git 提交祖先图来告诉你这些信息。因此,要使其成为一个完整、方便的功能,还有很多工作要做。
希望对您有所帮助。