将一个分支拆分成一个新的回购协议

Split out a branch into a new repo

我有一个 mercurial 存储库,现在实际上包含两个存储库。 在过去的某个时候,一个分支从 default 中分离出来(我们称之为 default-other)。 defaultdefault-other 现在都有很多提交,并且没有计划合并 default-other 回到 默认值 。一些提交已从 default 移植到 default-other.

现在,我想从 default-other 分支创建一个新的 repo,同时保留完整的历史记录。即包含

的回购协议

最理想的是,我想针对不同的分支使用不同的策略。有些分支是必须保留的发布分支,而其他分支是我想折叠到新 default.

中的功能分支

我尝试使用转换扩展,但我不知道如何正确设置分支映射。

只需使用 described in wiki 格式的分支图。在你的情况下,这很简单

default-other default
...
renamed-child1 default
renamed-child2 default
...

加法

因为 Convert 扩展不能停止条件“之前”的转换,只能停止“之后”(参见 --rev 选项),您必须在转换过程之前为转换准备存储库(仅克隆到新的中间存储库没有 default,只有 default-other 和后代的子集或原始变更集?)

我认为您几乎可以使用 hg strip 完成您所说的所有事情。像这样:

  1. 将原始仓库克隆到新仓库
  2. hg up null 从工作目录中删除任何东西(这样使用它可能会更快)
  3. 确定要删除的所有分支(命名的或匿名的)和变更集。准确地说,您想要的是每个提交的变更集 ID 及其应删除的后代。
  4. hg strip -r 12345678890 对于每个提交。这将删除提交及其所有后代(可能包括合并)。

如果需要,您可以执行此过程两次,但第二次去除正交的变更集集(那些属于 default-other 但不属于 默认).

也就是说,有几个原因您可能仍想使用 hg convert:

  1. 存储库中有不相关的文件。例如,如果 default 分支有一些与 default-other 无关的旧内容。您可以使用 convert 删除此类文件的历史记录。

  2. 您希望 defaultdefault-other 看起来总是同一个分支。您可以使用 convert 重命名其中一个或两个。 (branchmap)

  3. 你要确保新的回购不能 pushed/pulled 与原来的可能会搞砸你所有的 well-laid 计划。通过“转换”整个 repo,IIRC 所有的变更集 ID 都将被更新,并且 repo 看起来不像原始版本的亲戚。


我的建议是分阶段工作:

  1. 将原件克隆到 clone1
  2. 使用 strip 完成尽可能多的事情
  3. 从克隆 1 制作克隆 2
  4. 运行 convert 任务 #1
  5. 从 clone2 制作 clone3
  6. 运行 convert 任务 #2

等等

我建议不要将许多不同的 convert 东西放在一起 - 运行 它们以小的增量进行。这似乎需要更长的时间,但这样更容易正确。

最终您可以删除所有中间克隆,但根据经验,我发现这是进行重大结构更改的最有效和最安全的方法。