cvs2git:保持从CVS修订版号到Git修订版哈希的映射的可能性

时间:2013-06-14 12:01:46

标签: git cvs cvs2git

我们使用cvs2git将大型CVS存储库迁移到GIT。对于内部工具,我们需要从CVS修订号到一些文件的GIT修订版哈希的映射。

cvs2svn有一个参数--cvs-revnums,但此修订版仅存储在svn文件属性中,不适用于git。

我看到git cvsimport -R创建了这个映射,但cvs2git还有许多其他缺点。

是否还有其他可能从--cvs-revnums获取信息?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要一种方法来回答“第一个包含文件FOO的CVS修订版X.Y的第一个Git提交是什么?”。

如果打开cvs2git verbose output(“ - 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”,这会创建提交并计算它们的哈希值。

Tellya我要做什么......

我刚刚更改了cvs2svn的trunk版本,导致O​​utputPass发出更多信息,即“mark”对应哪个伪Subversion版本号。上述提交的输出如下所示:

Writing commit r23 on Branch('B_MIXED') (mark :1000000021)

反过来,标记“:1000000021”可以通过询问“git fast-import”将其标记写入文件来转换为Git SHA-1:

cat ../git-blob.dat ../git-dump.dat | git fast-import --export-marks=FILENAME

在结果文件中查找如下所示的行:

:1000000021 0aa255270fbb94ad691d5391a6d37c2ee6d78b03

你可以从中读取Git哈希。

您仍然需要做一些工作来将所有这些信息整合在一起,但现在至少它应该原则上

请注意,此方法只会告诉您包含CVS文件修订版的第一个Git提交。它将告诉您该文件修订何时合并到其他分支。事实上,由于CVS和Git之间的阻抗不匹配,您不能依赖Git提交祖先图来告诉您该信息。因此,还有很多工作要做,以使其成为一个完整,方便的功能。

希望有所帮助。

答案 1 :(得分:1)

感谢您的回答!

现在我已成功完成从CVS到GIT的迁移。

因为我们只需要在Git Hash和CVS修订版之间映射每个存储库中的几个文件, 我以一种对我来说更容易的方式解决了所描述的问题:

  1. 使用cvs2svn将CVS存储库从CVS迁移到GIT。
  2. 对于文件A:从CVS服务器的所有分支接收所有CVS提交,按时间顺序排列在单个列表中。
  3. 接收来自GIT文件A的所有分支的所有提交,按时间顺序排序(忽略提交注释"此提交由cvs2svn&#34制造;)在单个列表中。
  4. 确保两个列表中GIT提交的CVS数量完全相同(以确保没有人对CVS进行更新的提交)。
  5. 将每个CVS修订版映射到单个GIT哈希。
  6. 现在我们为每个CVS修订版提供了第一个包含CVS文件修订版的Git Commit。这对我们有用,因为我们在一个文件中没有CVS提交,在不同的分支中具有相同的时间戳。