使用Mercurial,我试图获取自上一个标签以来分支的历史记录。 但我想包括所有合并的评论。
我们的开发人员通常创建一个分支,做一些工作,可能多次提交,然后将分支合并回来。
使用:hg log -b。 -r" last(tagged())::" --template" {desc | firstline} \ n"
我会得到像" Merge" - 没有关于合并中包含哪些提交的信息。
如何让它包含合并的提交? 我们还有多个活动分支,因此只包括所有分支的所有提交都无法工作。
答案 0 :(得分:0)
这里至少有两个问题似乎(在分析之后)源于使用-b .
。可能还有更多问题。我会按照某种顺序接受它们,不一定是最好的,也许是最差的。 : - )
-b
和last(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>