查找逻辑更改日志

时间:2018-03-08 21:52:54

标签: mercurial

我正在试图找到一种获取奇怪特定日志的方法。这是输入到另一个程序中,我正在解析日志并使用它们进行处理,但理想情况下,使用hg命令尽可能地做很多事情来最小化我的后处理。

我希望所有提交标记为“O”且没有“X”提交:

A5 O
   |
   |
   |
A4 O   X B4  X C2
   |\  |     |
   | \ |     |
   |  \|     |
A3 O   O B3  |
   |   |     |
   |   |     |
   |   |     |
A2 O   O B2  X C1
   |   |     |
   |   |     |
   |   |     |
   |   O B1  |
   |  /|     |
   | / |     |
   |/  |     |
A1 X   X B0  X C0
   |
   |
   |
A0 X

鉴于此图表,其中A,B和C是不同的分支,我们的用户需要在A2和A5之间记录更改。问题是他们也想知道任何分支合并到A的历史的其余部分。

hg log -r A2:A5将返回:

  • A2,3,4,5
  • B2,3,4
  • C1,2

首先,我不想要C。它与此处没有任何关联。 但我真正想要的是B1,或更一般地说B中的所有变化,因为它最后被合并到A中。另外我不想要B4。因此,如果我有更多连接的悬挂尾巴,我需要找到其余的。令人讨厌的是,他们想要A1。

我当前的计划是日志A2:A5,然后我通过解析结果创建树结构。最后,我寻找任何悬挂的尾巴,并获得该尾部的共同祖先和A2和A2的日志,仅用于该分支。这有点令人费解和疯狂。

任何想法或建议都可以简化这项工作并减少我必须做的后处理工作?

1 个答案:

答案 0 :(得分:2)

您当前方法的改进将为hg log -r "A5 % parents(A2)"。这相当于A5及其所有祖先,少了A1及其任何祖先,所以它返回:

  • A2A3A4A5
  • B0B1B2B3

值得注意的是,以下内容将被排除在外:

  • C
  • 中的任何变更集
  • B中尚未合并为A的变更集(例如B4

结果revset中只有一个不需要的变更集:B0。删除标准对我来说有点不清楚(这可能有助于查看祖先A0B0C0,因为它们在某些时候都会来自一个公共节点)。我认为在构造revset之前需要澄清在合并到A2 :: A5的分支上向后倒退的停止条件。

然而,该revset可能会非常复杂,而且可能更容易对上述revset进行后处理。

编辑:进一步的想法

你可能最好做多个不同的复兴:

  1. hg log -r "A2::A5"将DAG从A2返回到A5(即A2A3A4A5)< / LI>
  2. hg log -r "(parents( A2::A5 & merge() ) - ( A2::A5 + parents(A2) ) )"将返回已将合并到 DAG中的任何变更集A2A5(即B3
  3. 第一个将直接转到最终结果集。您可以迭代的第二个(想象一下,还有一个分支D,其中D3已合并到感兴趣的分支中)并遍历每个分支朝向停止标准,然后将相关的变更集添加到最终结果集中。

    迭代合并的分支以在正确的时间停止可能比尝试修剪错误包含的变更集的更大结果集更简单