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

从特定版本中提取文件-mercurial,mercurial,Mercurial,我有3个存储库,每个存储库都是用相同的代码库创建的,但不同的代码库足以保证不同的存储库。我的“梦想”工作流程是在开发存储库中进行工作,然后将这些更改拉到其他存储库中。我知道我可以用以下方法来实现: hg pull -r X -f repo 但这将为我提供到X的所有变更集。是否可以从特定版本甚至从一系列版本中提取所有变更集?如果您想获取某些变更集的内容并将其应用于任意签出(注意:生成的变更集将是不同的变更集,即使它们进行了相同的更改),请查看。在mercurial中没有很好的方法来挑选修订(这就

我有3个存储库,每个存储库都是用相同的代码库创建的,但不同的代码库足以保证不同的存储库。我的“梦想”工作流程是在开发存储库中进行工作,然后将这些更改拉到其他存储库中。我知道我可以用以下方法来实现:

hg pull -r X -f repo
但这将为我提供到X的所有变更集。是否可以从特定版本甚至从一系列版本中提取所有变更集?

如果您想获取某些变更集的内容并将其应用于任意签出(注意:生成的变更集将是不同的变更集,即使它们进行了相同的更改),请查看。

在mercurial中没有很好的方法来挑选修订(这就是您建议的工作流的名称)。有一些不太好的方法可以做到这一点:导出+导入(或者导出+导入的方便包装称为移植),但这里的缺点是在多个存储库中使用不同哈希值的相同变更集,如果/当您再次尝试移动变更时,没有很好的方法来表示这一点

更好的方法是修改您的工作流,这样当您想要移动一个变更时,您可以移动它的所有祖先,而您可以通过有意识地选择变更集的祖先来实现这一点

例如,如果您正在修复开发存储库中的一个bug,以及所有三个“其他”存储库不只是更改更改的父版本,即开发存储库的
提示
。首先执行
hg更新-r添加错误的地方的\u版本,然后修复错误,然后提交。您将看到一条消息说
创建了新的头
,这是预期的

现在,您将该修复作为一个变更集,其唯一父项是引入错误的变更集——必须存在于其他3个存储库中,否则它们不会有错误。因此,现在您可以
将该新变更集拉入“3”中然后你在这四个库中的每一个库中进行一次快速的
hg合并
,将错误修复融入到它们的可部署
技巧中

掌握如何使用通用功能构建存储库(但每个存储库中都有自定义功能)可能有点棘手,但如果结构正确,您可以使用推、拉和合并来完成所有的内部回购迁移,并且永远不必两次修复错误,在不同的变更集中使用相同的代码,或者重新执行存储库的c定制


值得注意的是,bisect命令在回答“这个bug是从哪里引入的”这一问题上做得很好在开始修复之前提出问题。

更新的答案:从Mercurial 2开始,您可以使用运行良好的“”命令。它使用一些内部合并功能来确保您可以手动处理任何冲突。如果没有Mercurial无法自行解决的冲突,则新的变更集将自动执行在您当前修订版的基础上选择并提交。

如果我理解正确,如果所有存储库都可以跟踪到一个公共变更集,则此工作流可以工作?在我的情况下,情况并非如此。是的,我知道不是,但我的意思是,这听起来不太“判断”他们应该这样做。无论您的部署是如何定制的,如果它们有一些共同的代码,它们都应该是具有自己的变更集的克隆来进行定制——或者如果它们之间有一些共同的库代码,它们应该共享子库。这将是一个重新考虑的因素,但这将使您进入“梦想”工作流程你在上面提到过。是的,你是对的。虽然我对这些网站进行版本控制的时间已经晚了……mercurial似乎是我不得不做的事情的完美选择,但为了实现我的梦想而重构一切可能不会让我的雇主很高兴;)感谢您的输入,它确实帮助我更好地理解Mercurial的工作原理)这几乎给了我想要的东西,只是当发生冲突时,我会得到那些.rej文件,而不是使用合并工具。你知道有什么简单的方法来处理这些问题吗。rej而不是手动解析它们并解决冲突?对于希望解决问题的新手读者,请参阅下面我的更新答案,以获得一个内置的、运行良好的解决方案。这似乎根本不起作用,因为
graft
在分支之间复制,而不是repo。