3

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

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

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

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

4

2 回答 2

2

如果我理解正确,您想要一种方法来回答“包含文件 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 提交祖先图来告诉你这些信息。因此,要使其成为一个完整、方便的功能,还有很多工作要做。

希望有帮助。

于 2013-06-18T09:35:38.977 回答
1

谢谢您的回答!

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

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

  1. 使用 cvs2svn 将 CVS 存储库从 CVS 迁移到 GIT。
  2. 对于文件 A:从 CVS 服务器的所有分支接收所有 CVS 提交,按时间顺序排列在一个列表中。
  3. 从 GIT 接收文件 A 的所有分支的所有提交,在单个列表中按时间顺序排序(忽略带有注释“此提交由 cvs2svn 制造”的提交)。
  4. 确保两个列表中 GIT 提交的 CVS 数量完全相同(以确保没有人对 CVS 进行更新的提交)。
  5. 将每个 CVS 修订版映射到单个 GIT 哈希。

现在,对于每个 CVS 修订,我们都有包含 CVS 文件修订的第一个 Git Commit。这对我们有用,因为我们在一个文件中没有在不同分支中具有相同时间戳的 CVS 提交。

于 2014-04-14T11:46:48.157 回答