2010-10-17 66 views
8

我有3个版本库,每个版本都使用相同的代码库创建,但不同的版本足以保证不同的版本库。我的“梦想”工作流程是在开发仓库中完成工作,然后将这些更改引入其他仓库。我知道我可以像这样做:从特定版本拉文件 - mercurial

hg pull -r X -f repo 

但是这会给我所有的变更多达十是否有可能只是把所有的变更集从一个特定的版本,甚至从各种版本的?

回答

7

如果你想抓住内容某些变更集,并将它们应用到任意结帐(注:所产生的变更将不同的变更,即使他们做出同样的变化),看看在transplant extension

+0

这几乎给我我想要的,除了发生冲突时,我得到这些.rej文件,而不是采取我合并工具。你知道任何简单的方法来处理这些.rej,而不是手动解析它们并解决冲突吗? – mdonovan2010 2010-10-17 23:45:57

+0

对于希望解决问题的新读者:请参阅下面我的更新答案,了解内置的,运行良好的解决方案。 – Lstor 2012-10-15 09:12:33

8

有没有樱桃选择mercurial修订(这就是你所提出的工作流程称为)。有一些不太好的方法可以做到这一点:export + import(或者导出+导入的便捷包装器,称为移植),但是那里有一个相同的变更集,在多个存储库中有不同的哈希值,没有好处方式来表示如果/当您尝试再次移动更改时。

更好的方法是修改您的工作流程,以便当您想要移动所有祖先时可以移动,并且您通过有意识地选择变更集的祖先来执行此操作。

例如,如果您正在修复开发存储库中的错误,并且所有三个“其他”存储库不只是更改开发存储库的更改的父版本tip。首先做一个hg update -r THE_REVISION_WHERE_THE_BUG_WAS_ADDED,然后修复你的bug,然后提交。你会看到一条消息new head created,这是预期的。

现在,您已经将修复程序作为变更集的唯一父变体引入了该变更集 - 该变更集必须存在于其他3个存储库中,否则他们不会有该错误。所以现在你可以将新的变化集合到“3”其他的仓库中,而不用把所有其他的东西带到开发中去。然后,您在这四个存储库中的每一个中快速执行hg merge,将缺陷修复程序混合到其可部署的tip中。

掌握如何构建具有通用功能但各自定制的存储库可能会有点棘手,但如果您正确构建正确的操作,则可以使用推,拉和合并完成所有的intra-repo迁移,而且不必修复两次错误,在不同的变更集中使用相同的代码,或重新执行存储库的定制。

作为一个说明,在开始修复它之前,bisect命令很好地回答了“在哪里引入了该错误”问题。

+0

如果我正确理解这一点,那么如果所有存储库都可以追溯到通用变更集,那么此工作流程将起作用?在我的情况下,情况并非如此。 – mdonovan2010 2010-10-17 23:17:30

+0

是的,我认识到它不是,但我的意思是,他们应该没有听起来“审判”。无论您的部署是如何定制的,如果它们具有一些共同的代码,它们应该是具有自己的自定义更改集的克隆 - 或者应该共享subrepos,前提是它们之间有一些通用的库代码。这将是一个重要因素,但它会让你接受上面提到的“梦想”工作流程。 – 2010-10-18 02:00:35

+0

是的你的权利。我迟到了控制这些网站的版本,虽然...... mercurial似乎是我必须做的完美选择,但重构所有事情只是为了实现我的梦想,可能不会让我的雇主非常高兴;)谢谢你你的意见,这无疑帮助我更好地理解Mercurial的工作方式) – mdonovan2010 2010-10-18 02:41:47

7

已更新回答:从Mercurial 2开始,您可以使用'graft'命令,该命令可以很好地工作。它使用一些内部合并功能来确保您可以手动处理任何冲突。如果没有Mercurial无法自行解决的冲突,则新的变更集会自动在当前修订版本的顶部进行樱桃挑选并提交。