我们使用cvs2git
将大型CVS存储库迁移到GIT。对于内部工具,我们需要从CVS修订号到一些文件的GIT修订版哈希的映射。
cvs2svn
有一个参数--cvs-revnums
,但此修订版仅存储在svn文件属性中,不适用于git。
我看到git cvsimport -R
创建了这个映射,但cvs2git还有许多其他缺点。
是否还有其他可能从--cvs-revnums
获取信息?
答案 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版本,导致OutputPass发出更多信息,即“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修订版之间映射每个存储库中的几个文件, 我以一种对我来说更容易的方式解决了所描述的问题:
现在我们为每个CVS修订版提供了第一个包含CVS文件修订版的Git Commit。这对我们有用,因为我们在一个文件中没有CVS提交,在不同的分支中具有相同的时间戳。