【问题标题】:cvs2git: Possibility to keep mapping from CVS revision numbers to Git revision Hashcvs2git:保持从 CVS 修订号映射到 Git 修订哈希的可能性
【发布时间】:2013-06-14 12:01:45
【问题描述】:

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

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

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

还有没有其他方法可以从--cvs-revnums获取信息?

【问题讨论】:

    标签: git cvs cvs2git


    【解决方案1】:

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

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      感谢您的回答!

      现在我成功完成了从 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 提交。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-24
        • 1970-01-01
        相关资源
        最近更新 更多