我有3个存储库,每个存储库都使用相同的代码库创建,但足以保证不同的存储库。我的“梦想”工作流程是在开发存储库中完成工作,然后将这些更改提取到其他存储库中。我知道我可以这样做:
hg pull -r X -f repo
但是这将为我提供最多X的所有变更集。是否可以从特定修订版本甚至从一系列修订版本中提取所有变更集?
答案 0 :(得分:8)
在mercurial中没有良好的方式来挑选修订版本(这就是你提议的工作流程的名称)。有一些不那么好的方法可以做到:export + import(或者导出+导入的方便包装器称为移植),但是那里的缺点是你有多个存储库中不同哈希的相同变更集,没有好处表示当您尝试再次移动更改时的方式。
最好是修改你的工作流程,这样当你想要改变你的所有祖先时,你就可以通过有意识地选择变更集的祖先来实现这一目标。
例如,如果您正在修复开发存储库中的错误,并且所有三个“其他”存储库不仅仅将更改的父版本更改为开发存储库的tip
。首先做一个hg update -r THE_REVISION_WHERE_THE_BUG_WAS_ADDED
,然后修复你的bug,然后提交。您会看到一条消息new head created
,这是预期的。
现在你已经将修复程序作为一个变更集,其中唯一的父项是引入错误的变更集 - 必须存在于其他3个存储库中,否则它们不会有错误。所以现在你可以pull
将新的变更设置到“3”其他存储库中,而不会将其他所有内容都包含在内。然后,您可以在这四个存储库中快速hg merge
将错误修复混合到可部署的tip
中。
掌握如何使用通用功能构建存储库但在每个存储库中进行自定义的方法可能有点棘手,但如果您正确构建了事物,则可以使用推送,拉取和合并来执行所有的内部仓库迁移,并且永远不必修复错误两次,在不同的更改集中使用相同的代码,或重新执行存储库的自定义。
作为一个注释,bisect命令在开始修复它之前,很好地回答了“这个bug引入的地方”的问题。
答案 1 :(得分:7)
如果您想获取某些更改集的内容并将其应用于任意结帐(请注意:生成的更改集将不同的更改集,即使他们创建了相同的更改),请查看transplant
extension。
答案 2 :(得分:7)
更新回答:从Mercurial 2开始,您可以使用效果很好的“graft”命令。它使用一些内部合并功能来确保您可以手动处理任何冲突。如果没有Mercurial无法自行解决的冲突,那么新的变更集将在您当前的修订版本之上自动编译并提交。