如何在Mercurial中的存储库之间推送/拉出单个变更集?

时间:2010-09-11 15:36:58

标签: mercurial push pull repository changeset

我有以下情况:

  • 我有网站A,它有Mercurial repo,我们已经开发了一段时间了。假设A有5次修改。
  • 我们现在必须创建站点B,它几乎与站点A完全相同,除了图形设计。所以我克隆了回购,开始了网站B,现在B的回购已经包含了A的所有历史记录,还有一堆永远不会回到A的变更集(主要是CSS和图像)。让我们说这些改变花了我3次修改。
  • 最后,我现在改变了B,我想回到A,因为它属于两个网站。这是B的回购中的第9版。

问题是:我怎样才能将修订版9从B的回购转移到A的回购中,而不是移动修订版6-8?

  • 我尝试过常规推/拉,但这会移动所有变更集。
  • 我尝试过导出捆绑包或补丁程序,但由于父项缺失而拒绝导入A中。

我认为DVCS的优点之一就是我可以轻松地做到这一点(在“集中式”VCS世界中,我可以通过分支和合并轻松修复,我已经使用Vault做了很多而且它是很容易)。

我在这里错过了什么吗?

注意:我查看了“MQ”,但这似乎是一大堆蠕虫,看起来它只会影响正常的提交周期。这是对的吗?

任何帮助或指示将不胜感激。谢谢!

丹尼尔

3 个答案:

答案 0 :(得分:11)

https://www.mercurial-scm.org/wiki/wiki/TransplantExtension

参见“使用移植来樱桃挑选一组变更集”:

  

移植可以管理多个变更集或变更集范围   这样:

hg transplant REV1:REV2 REV3
     

这个例子可以解释指定的变更集范围   REV1:REV2和工作目录上的附加变更集REV3   修改

理想情况下,您可以使用分支机构执行此操作吗?

答案 1 :(得分:11)

我以这种方式思考命令:

  • hg bundle为您提供变更集的二进制版本,hg unbundle会将捆绑包转换为接收方的完全相同的变更集。

    Bundle和unbundle用于传输变更集,比如电子邮件,二进制补丁取决于要存在的父变更集。

  • hg export为您提供变更集的文本表示,除非您使用--exact命令行标记hg import,否则应用此修补程序不会创建完全相同的变更集在接收方。

    不使用--exact的好处正是您可以在任何地方应用此类补丁,只要没有文字冲突。

  • hg transplant只是hg exporthg import的精简包装。

答案 2 :(得分:1)

如果您想在mercurial仓库中“折叠”或跳过历史记录,只需更新到基本修订版(在要折叠的部分之前)。如果你想将上面的所有内容折叠成一个变更集(这看起来像你想要的那样),你只需恢复到该分支的头部并提交它(或只提交你想要的文件) 。这将创建一个包含你想要的东西的新变更集,这样你就可以将它推送到你的网站A.你不想要的东西,你只是忽略(或者如果你不能忽略它就剥掉它)。

如果您希望保留多个更改集,则应 rebase 。启用rebase扩展并将#9重新绑定到#5。如果有#9的孩子,这些将会随之移动。 Rebase比移植更好(它做类似的事情)因为rebase使用3向合并机制来迁移变更集,使其更有可能成功。移植或多或少只是一种愚蠢的出口导入,因此它忽略了共同的历史。