Mercurial,获取自上次标记以来的分支历史 - 包括提交中的合并

时间:2017-07-13 16:08:02

标签: mercurial revision-history

使用Mercurial,我试图获取自上一个标签以来分支的历史记录。 但我想包括所有合并的评论。

我们的开发人员通常创建一个分支,做一些工作,可能多次提交,然后将分支合并回来。

使用:hg log -b。 -r" last(tagged())::" --template" {desc | firstline} \ n"

我会得到像" Merge" - 没有关于合并中包含哪些提交的信息。

如何让它包含合并的提交? 我们还有多个活动分支,因此只包括所有分支的所有提交都无法工作。

1 个答案:

答案 0 :(得分:0)

这里至少有两个问题似乎(在分析之后)源于使用-b .。可能还有更多问题。我会按照某种顺序接受它们,不一定是最好的,也许是最差的。 : - )

结合-blast(set)似乎一般不明智

您的-b .约束意味着您只能获得当前分支上的提交。如果你的revset否则会包含另一个分支的提交,那么这些提交将被排除在外。或者,在-b .中使用hg log来使用另一种(更具集合理论)的方法,有点像采用你拥有的任何revset说明符并添加:

(revset) & branch(.)

- 虽然只是提出这个问题,但这提出了一个我不确定的问题:计算tagged()之前或之后? hg --debugger中的一些问题告诉我它在"之后#34;这意味着我们得到:

(last(tagged()) & (branch(.))

这意味着如果有标签,例如转速1,7和34,我们首先选择转速34,然后选择其分支是当前分支的修订。假设rev 7是当前分支的成员,但是rev 34不是。 &的结果是空集。

这可能不是问题 - 实际的最终表达是branch(.) & descendants(last(tagged())),或者可能也是last(tagged() & branch(.)) - 但至少在某些情况下,使用它可能更好:

-b

以便您从标记的最后一个修订开始,并在当前分支上开始。 (如果此修订列表为空,则不清楚接下来应该做什么,但这个级别很难编程,所以让我们假设修订列表中有一个修订版,例如,rev 7 in我们这里的例子。)

尽管如此,这可能不是你想要的;见下面的最后一节。

合并X::Y和DAG范围

Mercurial中的X之类的DAG范围运算符仅表示:所有提交/修订都是X的后代,包括Y本身,以及{{1的祖先},包括Y本身。省略Y完全意味着 X 的所有后代。如果没有-b限制器,您将获得所有此类提交,但使用-b .,您再次将自己限制为当前上的提交分支。

如果在一个分支内合并提交,那么,您将获得合并提交及其分支上的祖先和后代。 (请记住,在Mercurial中,任何提交都只在一个分支上,永远:这是提交本身时最新的分支。)但是如果你在Mercurial中使用分支,那么你可能正在合并其他分支。如果您想查看任何这些提交,则无法在此处使用-b .

得到你想要的东西

让我们回到上面的第一个声明:

  

使用Mercurial,我试图获取自上一个标签以来分支的历史记录。但我想包括所有合并的[提交]。

让我们快速绘制一两个例子,看看你可能需要哪些提交。

这是一个横向图,右边有较新的提交。每个提交都由o表示,除非它被标记,在这种情况下,它由*表示。有几个合并。前两行的提交在分支B1上,第三行的提交在分支B2上。

    o--o---o--o---o--*--o--o--o
b1:     \    /            /
         *--o            /
             \          /
b2:           o--*--o--o--o--o

我不清楚你希望看到哪些提交。 b1上的最后一次标记提交是最高行*,但b2上也有标记提交(其转号可能低于b1上的转号)。或者假设我们的图表略有不同,因此编号最高的标记版本是b2上的一个:

    o--o---o--o---*--o--o--o--o
b1:     \    /            /
         *--o            /
             \          /
b2:           o--o--*--o--o--o

如果我们使用表达式last(tagged())而没有任何分支掩码,我们将选择最右边的星号提交。然后,如果我们将其提供给DAG运算符(例如,X中的X::或使用descendants(),我们将获得"之后的所有提交。

当我们从b2上的单一星号提交开始时 - 就像在上一个图中一样 - 我们得到了提交以及b2上剩余的三个提交,以及最后两个提交的提交b1可能可能是您想要的,但也许您还希望在合并之前来到b1的某些提交,但是之后(可能还包括) b1本身的最终加星标提交。

请注意,这只是descendants(last(tagged())所带来的,即,如果您从原始-b .命令中删除hg log

当我们从b1上的最后一个星号提交开始时,就像在前面的图中一样,我们只获得该提交以及分支b1上的最后三个提交。合并的分支b2上的提交都不是我们选择的已加星标提交的后代。因此,DAG范围方法本身就是可疑的。但是,如果消除直接在b1上的标记提交就足够了,请注意我们可以使用:

descendants(last(tagged() and not branch(b1)))

(此处and&之间没有区别,我只是将其拼写出来,因为我拼写了not}。

我在这里看到另一种可能性:也许你想要任何提交,这些提交是当前分支的最终提交的祖先,但是停在:

  • 任何标记的提交或
  • 任何其他分支的任何前任合并,而不是通过遍历祖先到达的第一个合并分支。

可视化最后一种情况需要更复杂的分支拓扑,总共有两个以上的命名分支。由于它(a)很难和(b)根本不清楚这个你想要什么,我不会写一个表达来产生它。< / p>