冷凝一个mercurial存储库 - 推荐的方式?

时间:2018-01-20 14:29:06

标签: mercurial revision-history

假设我有一个存储库'Main',Max和co分别在一个克隆上工作。 Max有一些尚未推送到'Main'的本地提交('f'和'g')。这就是它现在的样子(管道是推/拉):

A--B1--B2--C--D1--D2--D3--E (Main)
|          |  |           |
A--B1--B2--C--D1--D2--D3--E--f--g (Max)

'B1'和'B2'以及'D1','D2'和'D3'是唯一合理的变化。我们希望将'B1'和'B2'组合成单个变更集'B',并将'D1','D2'和'D3'组合到单个变更集'D'。新结构应如下所示:

A--B--C--D--E (Main)
|     |     |
A--B--C--D--E--f--g (Max)

我的(主要)问题是:推荐的做法是什么?

现在让我们变得更糟: 我们有一个在我们想要崩溃的变更集中合并的分支。它看起来像这样:

A--B1--B2--C--D1--D2------D4--E (Main)
|          |  \-------D3-/    |
|          |                  |
A--B1--B2--C--D1--D2------D4--E--f--g (Max)
              \-------D3-/

新历史应如下所示:

A--B--C--D--E (Main)
|     |     |
A--B--C--D--E--f--g (Max)

你会怎么做? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

这取决于您想要投入多少精力。虽然我不知道Mercurial本身的解决方案(我只知道无法处理合并的历史编辑功能),但Git确实拥有您需要的功能:

如果我真的必须做这样的操作,我会

  • 试着说服管理层说这不值得
  • 努力说服管理层说这不值得
  • 做一个备份!以下步骤涉及破坏性操作,因此请将此视为不可选。 您已收到警告
  • 将带有hg-git的repo导出到git存储库
  • 将完整(git)历史记录导出为git fastexport --no-data --all > history.fi
  • 的快速导入流
  • 通过编辑history.fi,删除不需要的修订
  • 来创建伪历史记录
  • 使用``git fast-import -f< 将调整后的历史记录导入git仓库。 history.fi`
  • 广泛检查新创建的历史记录是否实际上是您希望的方式
  • Max克隆到本地工作存储库
  • 删除本地工作存储库中提交A的后继者
  • 将您更新的历史记录从git(再次使用hg-git)拉回到本地工作存储库
  • 检查Mercurial历史是否符合您的期望(新旧回购提交之间的提交差异,元数据(时间戳,提交者名称......)
  • 每个回购(主要,最高和每个开发人员克隆)中删除提交A的后继者
  • hg push -r E Main将部分历史记录退回到工作存储库中的Main
  • hg push -r g Max完整的历史记录返回工作存储库中的Max