mercurial - Mercurial 存储库中的变更集可以按时间顺序 merge 吗?

标签 mercurial

我想在项目 B 中重用项目 A 中的代码(两者都在单独的存储库中),因此我想将多个文件从原始项目存储库 A 移动到公共(public)存储库 C,该存储库将由项目B.(Maven等管理的依赖项)

我可以使用转换扩展和一些附加脚本(以发现所述文件的完整历史记录)仅提取我想要从 A 移动到它们自己的“过滤”存储库 F 中的文件。

在这个阶段我可以: a) 将 F 拉入 C, merge 并提交,或者 b) 将所有 F 更改导出为补丁,然后将其导入到 C 中 然而,这两种方法都会导致存储库 C 的变更集不按时间顺序排序。我看到 F 的历史放在 C 的历史之前。

是否可以“merge ”两个存储库,以便变更集按时间顺序排序?

我有脚本可以做到这一点 - 但到目前为止,每次我从 A 中移动不同的 F 集时,我都必须完全重建 C。(通过将所有 C 和 F 作为补丁导出,创建一个新的 C,然后导入所有补丁按时间顺序排列)。

谢谢!

最佳答案

不是真的。变更集的父级内置于其 nodeid(这是一个加密哈希)中,因此您无法在不完全更改/重建变更集的情况下重新排序变更集的实际父级。

您可以按照您想要的任何顺序将变更集引入存储库,前提是该变更集的父变更集位于它之前。

因此,如果 A 和 B 具有以下变更集,并具有以下修订号 (r=) 和创建时间 (t=):

A: null----[A r=0,t=0]----[C r=1,t=2]----[E r=2,t=4]
B: null----[B r=0,t=1]----[D r=1,t=3]----[F r=2,t=5]

您可以通过小心拉动创建一个像这样的存储库:

C: null----[A r=0,t=0]-------------------[C r=2,t=2]-------------------------[E r=4,t=4]
     \
      \-----------------[B r=1,t=1]--------------------[D r=3,t=3]------------------[F r=5,t=5]

但是这样做没有什么值(value),因为变更集的序列号(上面的 r)毫无意义)。

理想情况下,您的存储库 B 将是 A 的克隆,其所有本地修改仅存在于 B 中。这样,如果您修复 A 中的错误,您可以将其拉入 B 中,然后 merge 以修复该问题。移植/转换是一种空洞的替代品。另一种选择是将 A 和 B 的公共(public)部分提取到存储库 C 中,然后 A 和 B 都将其用作 Mercurial 子存​​储库。

关于mercurial - Mercurial 存储库中的变更集可以按时间顺序 merge 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4162722/

相关文章:

mercurial - 为什么 Mercurial 有时允许与祖先 merge ?

version-control - 从 SVN 转换为 Mercurial (Windows) 时如何保留文件名中的特殊字符?

mercurial - 两个命名分支的 Mercurial merge : Working Directory Has No Ancestor

mercurial - bitbucket mercurial 不正确显示用户名

mercurial - 如何让Windows上的TortoiseHg(Mercurial)使用(由Puttygen)生成的私钥文件?

version-control - Mercurial:运行 sed 命令后出现消息 "abort: index 00changelog.i is corrupted!"。如何处理?

mercurial - 在 Mercurial (Hg) 中,列出自修订版 4822 以来我修改的所有文件的好方法是什么?

mercurial - Mercurial 修订集中 contains() 谓词的用途是什么?

c - Mercurial 预 merge 钩子(Hook)

mercurial - 修复 Mercurial 警告 "copy source of X not in parents of Y"