【问题标题】:Can changesets in mercurial repositories be merged chronologically?mercurial 存储库中的变更集可以按时间顺序合并吗?
【发布时间】:2010-11-12 08:15:27
【问题描述】:

我想在项目 B 中重用项目 A 中的代码(都在单独的存储库中),所以我想将几个文件从原始项目存储库 A 移动到公共存储库 C,供以下人员使用项目 B.(由 Maven 等管理的依赖项)

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

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

是否可以“合并”两个存储库以使变更集按时间顺序排列?

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

谢谢!

【问题讨论】:

  • 我认为我们需要一些示例来说明您如何做到这一点。您不应该像那样定期重建您的存储库。
  • 完全是 Lasse - 这很痛苦,这就是为什么我正在寻找更好/更合适的解决方案。至于我是怎么做的,我将 C anf F 中的所有变更集导出到一组 .patch 文件中,使用 perl 脚本根据标题 cmets 中的日期戳确定这些变更集的时间顺序,然后初始化一个新的C,并按此顺序导入所有补丁。然后我必须在 Google Code 中重置 C,并将新的 C 推送到 Google。
  • 为什么按时间顺序排列很重要?如果只是出于审美目的,我会说只是咬紧牙关,采取一种直接的方法。如果不是,如果 F(作为 A 的一部分)和 C 到现在为止已经独立进化,你怎么能确定按时间顺序排列的结果是你想要的呢?你是否例如希望能够在特定时间检查 C(和 F),并期望一切都是一致的?我的直觉反应是,即使盲目的按时间顺序排列确实能让你大部分时间到达那里,你也需要人工干预。
  • 感谢您的回复。我希望更改集按时间顺序排列,以便我可以看到我的两个合并的代码集在特定时间点是如何看待的——如果我在同一个存储库中开发它们,他们会在那时看到它们。我刚刚尝试将这些“F”存储库中的两个合并到“C”中,然后将 C 更新到我知道每个 F 中两个文件的状态的日期 - 导致其中一个文件存在,但另一个文件不存在。
  • "...我是否在同一个存储库中开发了它们。" 但是,这种综合改变的历史观点是否重要到足以解决这个麻烦?例如您是否必须能够查看特定日期的组合代码才能在另一个项目中使用它,或者您只是好奇? :) 我找到了一种(痛苦的,可能是可编写脚本的)在选定日期合并 F 和 C(到第三个分支)的方法,然后使用 --date 提交合并以强加时间顺序 - 但值得吗?你能不能简单地将它们拉到不同的分支中,然后合并并声明“合并历史从这里开始”?

标签: mercurial


【解决方案1】:

不是真的。变更集的父级内置于其 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]

但是这样做的价值很小,因为变更集的序列号(上面的 r)没有意义)。

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

【讨论】:

  • 感谢您的回复 Ry4an。我想要实现的是你的“小心拉动”图,你显示的序列号,但都在一个分支上,而不是合并。就像我在同一个存储库中开发了 A 和 B 中的代码一样。然后我可以回到特定时间并查看当时的两组代码(参见对 shambulator 的响应) - 通过合并,我似乎能够回到顶部或底部分支上的某个时间点,但应该出现在“其他”分支上的更改不可见。
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多