从特定版本中提取文件 - mercurial

mdo*_*010 8 mercurial

我有3个存储库,每个存储库都使用相同的代码库创建,但又足以保证不同的存储库.我的"梦想"工作流程是在开发存储库中完成工作,然后将这些更改提取到其他存储库中.我知道我可以这样做:

hg pull -r X -f repo
Run Code Online (Sandbox Code Playgroud)

但这会给我所有的变更集到X.是否可以从特定版本甚至从一系列修订中提取所有变更集?

Ry4*_*ase 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引入的地方"的问题.


Amb*_*ber 7

如果您想获取某些变更集的内容并将其应用于任意结帐(请注意:生成的变更集将是不同的变更集,即使它们进行相同的更改),请查看transplant扩展名.


Lst*_*tor 7

更新的答案:从Mercurial 2开始,您可以使用可以很好地运行的' graft '命令.它使用一些内部合并功能来确保您可以手动处理任何冲突.如果没有Mercurial无法自行解决的冲突,那么新的变更集将在您当前的修订版本之上自动执行.