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

标签 git cvs cvs2git

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

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

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

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

最佳答案

如果我理解正确,您需要一种方法来回答“包含文件 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”,后者创建提交并计算它们的散列。

Tellya 我要做什么...

我刚刚对 cvs2svn 的主干版本进行了更改,这导致 OutputPass 发出更多信息,即哪个“标记”对应于哪个伪 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 提交。它不会告诉您该文件修订何时 merge 到其他分支。事实上,由于 CVS 和 Git 之间的阻抗不匹配,您不能依赖 Git 提交祖先图来告诉您该信息。因此,要使它成为一个完整、方便的功能,还有很多工作要做。

希望对您有所帮助。

关于git - cvs2git:保持从 CVS 修订号到 Git 修订哈希的映射的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17108030/

相关文章:

javascript - 与 Git/GitHub 协作使用 Node 测试代码

github - cvs2svn cvs2git : map cvs users to github users

Git:在裸存储库中更改事件分支的正确方法?

bash - 如何使用 git shortlog 聚合单个目录中多个存储库的用户提交统计信息?

svn - 取消合并 cvs/svn 中的任意合并

eclipse - "same"项目的两个不同符号

git - 如何配置 cvs2git 来处理多个 CVS 目录?

git - 为什么在起源不是远程名称的情况下使用 “git push origin master”?

sql-server - SQL Server DDL 代码的版本控制