我们将大型 CVS 存储库迁移到具有cvs2git
. 对于内部工具,我们需要从 CVS 修订号到某些文件的 GIT 修订哈希的映射。
cvs2svn
有一个参数--cvs-revnums
,但这个修订只存储在 svn 文件属性中,不适用于 git。
我看到它git cvsimport -R
创建了这个映射,但 cvs2git 有许多其他缺点。
是否还有其他可能从中获取信息--cvs-revnums
?
如果我理解正确,您想要一种方法来回答“包含文件 FOO 的 CVS 修订版 XY 的第一个 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 提交祖先图来告诉你这些信息。因此,要使其成为一个完整、方便的功能,还有很多工作要做。
希望有帮助。
谢谢您的回答!
现在我成功地完成了从 CVS 到 GIT 的迁移。
因为我们只需要每个存储库中的几个文件的 Git Hash 和 CVS 修订版本之间的映射,我以一种对我来说更容易的方式解决了所描述的问题:
现在,对于每个 CVS 修订,我们都有包含 CVS 文件修订的第一个 Git Commit。这对我们有用,因为我们在一个文件中没有在不同分支中具有相同时间戳的 CVS 提交。