【问题标题】:Condensing a mercurial repository - recommanded way?压缩一个 mercurial 存储库 - 推荐的方式?
【发布时间】:2018-06-29 15:36:57
【问题描述】:

假设我有一个“主”存储库,Max 和他的合作伙伴各自开发了一个克隆。 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)

你会怎么做? 提前致谢。

【问题讨论】:

    标签: mercurial revision-history


    【解决方案1】:

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

    如果我真的必须做这样的手术,我会

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

    【讨论】:

    • 谢谢。设法说服管理层:-) 但我会记住这一点。这似乎是一个合理的解决方案。
    猜你喜欢
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2011-10-29
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多