这里至少有两个问题(经过分析)源于使用-b .。可能还有更多问题。我会按某种顺序排列它们,不一定是最好的,甚至可能是最差的。 :-)
将-b 和last(set) 结合起来一般来说是不明智的
您的-b . 约束意味着您只能获得当前分支上的提交。如果您的 revset 将包含另一个分支上的提交,则这些提交将被排除在外。或者,换一种说法(更具集合论),在hg log 中使用-b . 有点像使用您拥有的任何revset 说明符并添加:
(revset) & branch(.)
——虽然只是问了这个问题,但这带来了我不确定的一点:限制是在计算tagged() 之前完成的,还是在计算tagged() 之后完成的? hg --debugger 中的一些讨论告诉我它是“之后”,这意味着我们得到:
(last(tagged()) & (branch(.))
这意味着如果有标签,例如revs 1、7和34,我们将首先选择rev 34,然后选择分支为当前分支的修订版。假设 rev 7 是当前分支的成员,但 rev 34 不是。 & 的结果就是空集。
这可能不是这里的问题——实际的最终表达式是,或者可能是,branch(.) & descendants(last(tagged()))——但至少在某些情况下,使用它可能会更好:
last(tagged() & branch(.))
这样您就可以从已标记的最后一个修订版和当前分支上开始。 (如果这个 revlist 为空,则不清楚下一步应该做什么,但在这个级别很难编程,所以我们假设 revlist 中有一个修订,例如,在我们的示例中为 rev 7。)
不过,这可能不是您想要的;请参阅下面的最后一节。
结合 -b 和 DAG 范围
像 Mercurial 中的 X::Y 这样的 DAG 范围运算符仅表示:所有作为 X 后代的提交/修订,包括 X 本身,以及 Y 的祖先,包括 Y 本身. 完全省略Y 意味着X 的所有后代。没有-b 限制器,您将获得所有 个这样的提交,但使用-b .,您再次将自己限制在当前 分支上的那些提交。 p>
如果您在一个分支中合并提交,那么您将获得该分支上的合并提交及其祖先和后代。 (请记住,在 Mercurial 中,任何提交永远都在一个分支上:这是提交本身时当前的分支。)但是,如果您在 Mercurial 中使用分支,您可能正在合并位于其他分支机构。如果你想查看任何这些提交,你不能在这里使用-b .。
得到你想要的
让我们回到上面的第一句话:
使用 Mercurial,我试图获取自上一个标签以来分支的历史记录。但我也想包括所有被合并的 [commits]。
让我们画一个或两个简单的例子,看看你可能想要哪些提交。
这是一个水平图,右侧是较新的提交。每个提交都由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()) 得到的结果,即,如果您从原始 hg log 命令中删除 -b .。
当我们从b1 上的最后一个星号提交开始时,就像前面的图表一样,我们只得到那个提交加上分支b1 上的最后三个提交。分支b2 上合并的所有提交都不是我们选择的星号提交的后代。所以 DAG-range 方法本身是可疑的,在这里。不过,如果消除直接在 b1 上的标记提交就足够了,请注意我们可以使用:
descendants(last(tagged() and not branch(b1)))
(这里and和&没有区别,我只是拼出来因为我拼出来了not)。
我在这里看到另一种可能性:也许您想要 any 提交是当前分支的最终提交的祖先,但在以下位置停止:
- 任何标记的提交,或
- 任何其他分支的前任合并,而不是通过遍历祖先到达的第一个合并分支。
可视化最后一种情况需要更复杂的分支拓扑,总共有两个以上的命名分支。由于 (a) 很难并且 (b) 我完全不清楚这 是 你想要的,所以我不打算编写表达式来生成它。