【发布时间】:2013-02-06 20:39:20
【问题描述】:
尝试将存储库从 cvs 迁移到 hg,我找到了工具 cvs2hg,它似乎做得很好(转换很好,我有所有的标签和分支)。 但是,hg documentation 警告“修复提交”会使存储库有些损坏或至少很危险。
这仍然是个问题吗?自编写此警告以来,也许 hg 或 cvs2hg 已从修复中受益。 如果可能,我如何在生成的 hg 存储库中检查我是否处于如此危险的情况?
【问题讨论】:
尝试将存储库从 cvs 迁移到 hg,我找到了工具 cvs2hg,它似乎做得很好(转换很好,我有所有的标签和分支)。 但是,hg documentation 警告“修复提交”会使存储库有些损坏或至少很危险。
这仍然是个问题吗?自编写此警告以来,也许 hg 或 cvs2hg 已从修复中受益。 如果可能,我如何在生成的 hg 存储库中检查我是否处于如此危险的情况?
【问题讨论】:
修复提交是好的和必要的。而且 cvs2hg 比 hg convert 做得更好。
但也许首先是关于问题的。在 CVS 存储库中,您可以使用标签和分支玩各种肮脏的把戏。例如,您可以手动微调一些标签,标记今天的 3 个文件版本、昨天的 4 个文件版本以及另一个长达一个月的版本。在实践中,我做了很多次“补丁标签”(有一些旧标签,后来我有各种提交,结果是一个错误,我修复了这个错误,通过旧标签制作修复标签,移动它在1-2个文件上)。
在结果中,如果将历史记录用于整个 repo,您将获得指向发布哪个 naver 已经存在或将存在于存储库历史记录中的任何点的标记。
类似的技巧可以用分支来实现。或者分支可以从“丑陋”标签开始。
在这种情况下,任何类型的 CVS 到 HG 的“自然”转换都是完全失败的。在基于时间的历史记录中,没有任何地方可以挂钩此类标签或分支。而 hg convert 只是在或多或少的随机位置绑定这些标签,并在非常丑陋的地方分支。
Fixup 提交只是那些缺少的修订:在适当的位置绑定并引入更改的人工提交,这些更改将存储库置于它应该处于给定标记的状态。有了这些,我们得到了“人工”标签和分支,正确绑定到正确的代码。
如果你:
然后基于 hg 转换的历史将有 4 个编辑变更集(就像上面的那些)和 blah_1.0 绑定在一些内容错误的丑陋地方。同时,cvs2hg 将创建“fixup commit”,它会人为地创建我们真正拥有 a.c(1.1)、b.c(1.1) 和 c.c(1.2) 的变更集,并在那里标记。在历史上,这样的变更集与移植/嫁接/樱桃采摘的提交相当相似。
【讨论】:
您应该仔细检查生成的存储库,以确保它代表您的代码历史记录并且不包含任何这些糟糕的修复提交。
顺便说一句,看看更新的http://www.catb.org/esr/reposurgeon/ 工具可能是值得的。
【讨论】: