压缩 mercurial 存储库 - 推荐方式?

Condensing a mercurial repository - recommanded way?

假设我有一个存储库 'Main',而 Max 和同事各自在一个克隆上工作。 Max 有一些本地提交 ('f'&'g') 尚未推送到 'Main'。这是现在的样子(管道 pushs/pulls):

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)

你会怎么做? 提前致谢。

这取决于你想为此付出多少努力。虽然我不知道 Mercurial 本身的解决方案(我只知道无法处理合并的历史编辑功能),Git 确实具有您需要的功能:

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

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