14

我有以下情况:

  • 我有站点 A,其中有 Mercurial 存储库,我们已经开发了一段时间。假设 A 有 5 次修订。
  • 我们现在必须创建站点 B,它与站点 A 几乎相同,但主要是图形设计。所以我克隆了 repo,启动了站点 B,现在 B 的 repo 包含了 A 的所有历史,加上一堆永远不应该回到 A 的变更集(主要是 CSS 和图像)。假设这些更改花了我 3 次修订。
  • 最后,我现在对 B 进行了更改,我想将其移回 A,因为它属于两个站点。这是 B 的 repo 中的第 9 版。

问题是:如何将修订版 9 从 B 的回购移动到 A 的回购,而不移动修订版 6-8?

  • 我尝试过定期推/拉,但这会移动所有变更集。
  • 我尝试过导出捆绑包或补丁,但由于缺少父级,它们拒绝在 A 中导入。

我认为 DVCS 的优点之一是我可以轻松地做这种事情(在“集中式”VCS 世界中,我可以通过分支和合并轻松修复,我已经用 Vault 完成了很多,这很容易) .

我在这里错过了什么吗?

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

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

丹尼尔

4

3 回答 3

11

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

请参阅“使用移植来挑选一组变更集”:

Transplant 可以像这样管理多个变更集或变更集范围:

hg transplant REV1:REV2 REV3

此示例将挑选由 REV1:REV2 指定的变更集范围和工作目录修订后的附加变更集 REV3。

理想情况下你会用分支来做这件事吗?

于 2010-09-11T15:43:46.740 回答
11

我这样想命令:

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

    捆绑和取消捆绑可以通过电子邮件传输变更集,而二进制补丁取决于要存在的父变更集。

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

    不使用的好处--exact恰恰是你可以在任何地方应用这样的补丁,只要没有文本冲突。

  • hg transplant只是围绕hg exportand的一个薄包装hg import

于 2010-09-12T11:13:38.500 回答
1

如果您想“折叠”或跳过 mercurial 存储库中的历史记录,您只需更新到基本修订版(在要折叠的部分之前)。如果你想把上面的所有东西都折叠成一个单一的变更集(这似乎是你想要的),你只需恢复到该分支的头部并提交它(或只提交你想要的文件)。这将使用您想要的内容创建一个新的变更集,以便您可以将其推送到您的站点 A。您不想要的内容,您只需忽略(或者如果您无法忽略它,则将其删除)。

如果您有多个要保留的变更集,您应该rebase。启用变基扩展并将 #9 变基到 #5。如果有 #9 的任何孩子,这些将随之移动。Rebase 比移植更可取(它做类似的事情),因为 rebase 使用 3 路合并机制来迁移变更集,使其更有可能成功。移植或多或少只是一种愚蠢的进出口,因此它忽略了共同的历史。

于 2011-04-10T12:10:49.550 回答