显示 "path to default"?

Display "path to default"?

我可以看到命名分支何时通过 this command 合并到 default:

hg log -r "children(ancestor(default, b21341)) and merge()" --template "{node|short} ({branch}) was merged on {date|date} -- {desc}\n"

但这会显示如下内容:

836230f2cbc3 (b21341) was merged on Tue Mar 28 09:51:28 2017 -0700 -- terrible terrible merge
65a95167a306 (default) was merged on Tue Mar 28 09:30:06 2017 -0700 -- Merged b30695 into default

如果你阅读那些精彩的提交消息,你会注意到第二条实际上是 "Merged b30695 into default",尽管我正在尝试弄清楚 b21341 是如何进入默认状态的。

那么如果我试图弄清楚 b21341 是如何合并到 b30695 中的,我会得到另外两个变更集:

hg log -r "children(ancestor(b30695, b21341)) and merge()" --template "{node|short} ({branch}) was merged on {date|date} -- {desc}\n"  
2e082d1b45e9 (b27369) was merged on Mon Mar 27 09:49:22 2017 -0700 -- merged in stable
73752628d887 (b29454) was merged on Mon Mar 27 11:28:41 2017 -0700 -- merge stable

等等。

我想要的是 graph 如何将 b21341 合并到默认设置中。即,它应该显示它合并到的所有不同命名分支的路径,直到它进入 default.

是否有可以执行此操作的查询?


我在想这样的事情

hg log -G -r "b21341:default and merge()" -T "{node|short} ({branch}) | {date|date} | {desc}"

但看起来不太对劲。我想查看 b21341 合并到的分支的名称,但前提是该分支最终合并到 default。该图也应该在合并到默认值时立即终止(上面的查询正在进行中)


产量:

$ hg log -G -r "descendants(ancestor(default, b21341)) and merge()" -T "{revset('p2(%d)', rev) % '{node|short} ({branch})'} => {node|short} ({branch}) | {date|date} | {desc|strip|firstline|strip}\n"
o    c461c6d7e725 (default) => f30e9413ff25 (default) | Tue Apr 04 12:17:20 2017 -0700 | merge
|\
| o    87e6f6864404 (default) => 682511875e7d (default) | Tue Apr 04 09:07:52 2017 -0700 | Automated merge
| |\
| | o  45ad99aabab6 (default) => a58e849eb198 (default) | Tue Apr 04 08:55:12 2017 -0700 | rpt-14
| |/
| o  36414f2bcbc2 (default) => a2c949bf13fc (default) | Mon Apr 03 20:49:27 2017 -0700 | merge
| |
| o  119a1960a61d (default) => 47fb25095be8 (default) | Mon Apr 03 20:34:25 2017 -0700 | merge
| |
| o    9c0a22b21d09 (default) => 84208df5a215 (default) | Mon Apr 03 20:17:39 2017 -0700 | merge
| |\
| o |  a9a51ef9230d (default) => 857ba78f4fdf (default) | Mon Apr 03 19:59:38 2017 -0700 | Automated merge
| |/
| o    c62e4f3565f6 (default) => f91b349e50b8 (default) | Mon Apr 03 19:39:37 2017 -0700 | Automated merge
| |\
| o |  ab9848c00bbc (default) => c62e4f3565f6 (default) | Mon Apr 03 19:07:48 2017 -0700 | fetch fixees. merged in
| |/
| o    714b6a6f826a (default) => 4a3e91baa604 (default) | Mon Apr 03 16:59:49 2017 -0700 | merge
| |\
| o |  c201b33f3ef5 (default) => 714b6a6f826a (default) | Mon Apr 03 16:27:37 2017 -0700 | ->Fetch updates
| |/
| o  4d0584f3722b (default) => 48e3df894646 (default) | Mon Apr 03 14:14:40 2017 -0700 | Automated merge
| |
| o  cc26a1fe435a (default) => 75eab9550876 (default) | Fri Mar 31 16:29:14 2017 -0700 | merge
| |
| o  2010d6c42271 (default) => 360677ad2709 (default) | Fri Mar 31 13:47:14 2017 -0700 | Mergey merge
| |
| o    c3013d9c21b0 (default) => d5f420767672 (default) | Fri Mar 31 12:42:27 2017 -0700 | Automated merge
| |\
| o |  d5fb7882ded8 (default) => c3013d9c21b0 (default) | Fri Mar 31 12:35:50 2017 -0700 | merge
| |/
| o  f6333f8b1927 (default) => 0ff996beb803 (default) | Fri Mar 31 11:07:56 2017 -0700 | Automated merge
| |
| o    12d521d98f45 (b28197) => 0aab8dd2b4c2 (default) | Thu Mar 30 14:36:29 2017 -0700 | Merged b28197 into default
| |\
| o \    8cc3cfdf55d1 (b30630) => 35f0a6f2c4f6 (default) | Thu Mar 30 14:36:26 2017 -0700 | Merged b30630 into default
| |\ \
| o \ \    c2b23ec72ff3 (b27477) => 5b6367131b36 (default) | Thu Mar 30 14:36:23 2017 -0700 | Merged b27477 into default
| |\ \ \
| | o \ \    95c0db6914cd (b28675) => bb46978c48c4 (default) | Thu Mar 30 14:32:09 2017 -0700 | Merged b28675 into default
| | |\ \ \
| | o \ \ \    866073c5de8e (b28336) => 80b486aaf058 (default) | Thu Mar 30 14:32:06 2017 -0700 | Merged b28336 into default
| | |\ \ \ \
| | o \ \ \ \    fcc5c3791172 (b30353) => 605a51c52f65 (default) | Thu Mar 30 14:30:28 2017 -0700 | Merged b30353 into default
| | |\ \ \ \ \
+---o | | | | |  1446674834b8 (b30774) => e2aed3cc1b97 (default) | Thu Mar 30 14:30:25 2017 -0700 | Merged b30774 into default
| | | | | | | |
+---o | | | | |  32a22fb906b1 (b28867) => 6b4824d7c988 (default) | Thu Mar 30 14:30:22 2017 -0700 | Merged b28867 into default
| | | | | | | |
o | | | | | | |    d3fbf05d250f (b30590) => 8b52881b125f (default) | Tue Mar 28 16:28:06 2017 -0700 | Merged b30590 into default
|\ \ \ \ \ \ \ \
o \ \ \ \ \ \ \ \    bade429fce2f (b30287) => f5a0585d38ac (default) | Tue Mar 28 15:25:47 2017 -0700 | Merged b30287 into default
|\ \ \ \ \ \ \ \ \
o \ \ \ \ \ \ \ \ \    65a95167a306 (default) => 784f90350d9f (default) | Tue Mar 28 10:39:38 2017 -0700 | Merged namespace fix
|\ \ \ \ \ \ \ \ \ \
+-------o | | | | | |  65a95167a306 (default) => c2b23ec72ff3 (b27477) | Tue Mar 28 10:36:48 2017 -0700 | Merged in default
| | | | | | | | | | |
o | | | | | | | | | |    2fa39946baa0 (b30695) => 65a95167a306 (default) | Tue Mar 28 09:30:06 2017 -0700 | Merged b30695 into default
|\ \ \ \ \ \ \ \ \ \ \
+-----------------------o  766f032973cf (default) => 836230f2cbc3 (b21341) | Tue Mar 28 09:51:28 2017 -0700 | terrible terrible merge
| | | | | | | | | | | | |
o | | | | | | | | | | | |    c1bbe7368498 (default) => 766f032973cf (default) | Tue Mar 28 09:22:44 2017 -0700 | moving stable merginess
|\ \ \ \ \ \ \ \ \ \ \ \ \

但这并不完全正确。

  1. 它跟踪默认设置到现在——我希望它在分支进入默认设置后立即停止
  2. 它没有清楚地说明 b21341 是如何进入默认状态的。在底部附近,我看到 default 被合并到 b21341 中,但我仍然看不到 b21341 在哪里合并到其他东西中。

根据您的文本更新,听起来您想要 "merges in the DAG range that starts at the merge base of default and b21341 and continues through to, but does not exceed, some possibly-difficult-to-specify node."(尽管您可能想要一个完全不同的起点,Mercurial 可以为您提供,但 Git 不能。)

任何基于提交图的操作在这里都有问题。我们知道从哪里 开始 查看图表:它是 "all commits belonging to branch b21341" 或 "the merge base of default and b21341"。因为 Mercurial 会记住 哪个分支 任何给定的提交,我们可以区分这两种情况,我们可以用非常简单的情况来说明:

...--A--o--...--D--o--...--F--...--H  (default)
      \        /          /
       B--o---C--o--...--E--...--G    (b21341)

在这里,"interesting" 提交是 A,这是分支 b21341default 分叉的点; B,这是对 b21341 本身的 第一次 提交; C,它是 b21341default 的共同祖先; D,这是 default 上的合并提交,引入了 b21341E,也就是最后一个的共同祖先; F,这是另一个合并; G,也就是b21341中的头部;和 H,这是 default 中的头部。 (这假设每个命名分支中只有一个头,情况不一定如此,但如果我们有多个未命名的头,就很难谈论它们了!)

在 Mercurial 中,我们总能找到所有这些有趣的提交。 (我们不能在 Git 中,它不记得提交的分支:E 左边的所有内容都在 both 分支上。Git 有一个技巧可以帮忙,即只跟随 --first-parent,但要使用它你必须练习良好的合并纪律,这不是每个人都这样做。)找到它们的表达式可能会变得冗长和复杂,但它是总是可能.

如果你想从提交E开始,那就是你一直在使用的表达式:ancestor(default, b21341)。从 B 开始很容易,它是 first(b21341)。找到 C 似乎有点困难(这是将 "upward" 合并到 default 或合并到 default 的一组提交中的第一个,因此 first(something),但指定 set 很难,或者至少很难)我不打算在这里尝试。


在这种情况下,当然,b21341并不是直接合并default,而是通过一些中间人或中间人。因此,我们有一组不同的 "interesting" 提交,尽管我将保留之前的 FH,同时添加新的单个字母来表示新的有趣提交:

...-----------------F--...-G-...-H  (default)
 .                 /      /
  .               E----...          (some branch)
   .             /
    .           D--...              (yet another branch)
     \         /
      B--...--C--...                (b21341)

认为 你的 "interesting" 提交以 C 开头,这又是 ancestor(default, b21341)。出于压缩显示的目的,我只绘制了向上合并返回到 default,但是在每个中间分支上可能有任意数量的非合并提交,即在 D 之前和在 E 之前,我们希望跳过。可能还有其他合并,例如 G,我们 希望跳过,因为它们不在 C 的直接路径上:即,什么我们想要做的是当我们遇到 default 上的合并时停止 并且 C:

的后代
first(descendants(ancestor(default, b21341)) and merge() and branch(default))

所以我认为这里的 revset 表达式有点可怕 :-) :

(ancestor(default, b21341)::first(descendants(ancestor(default, b21341)) and merge() and branch(default))) and merge()

选择了我们的一个或多个提交节点后,我们可以显示 it/them 我们喜欢的模板。我不确定是否有更有效的方法来做到这一点:

'{node|short} ({revset(p2node) % "{node|short} {branch}"} => {branch}) {desc}'

但这就是我们想要的,如果我们选择提交 F 并希望查看 E 的节点 ID 以及 E 上的哪个分支提交 E' s 分支名称(在这种情况下,F 当然在 default 上)。

如果有额外的合并"between" CF,例如,如果两个中间分支相互合并几次,你会把它们都捡起来。如果不编写实际的 Python 代码,这是很难避免的。不过,此处的模板应该可以很好地识别它们。

将这些放在一起并分解长行:

hg log -G -r '(ancestor(default, b21341) :: \
    first(descendants(ancestor(default, b21341)) and \
       merge() and branch(default))) and merge()' -T \
    '{node|short} ({revset(p2node) % "{node|short} {branch}"} => {branch}) {desc}'

当然我没有测试,因为我没有你的存储库。