压缩 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
返回完整历史
假设我有一个存储库 '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
返回完整历史