mercurial:测试分支是否包含变更集

res*_*esi 13 mercurial

我想知道是否有一个mercurial命令/扩展只测试给定的变更集是否在分支中.该命令将类似于:

hg contains [-r branch] changeset_id
Run Code Online (Sandbox Code Playgroud)

并应检查给定的变更集是否在当前/给定分支中,只返回"是"或"否".

我知道"debugancestor"命令,但是"是/否"答案更容易阅读.

如果有,是否有可能检查移植的变更集?

编辑:场景位于一个repo中,其中命名分支有多个头.让我们说一个分支被命名为"dev-X",具有超过1个头和更长的历史,至少用各种图形可视化跟踪它.我想弄清楚分支"dev-X"中的变更集X是否合并到另一个"dev-X"的头部.因此,我不能使用分支名称,只能使用变更集编号/哈希来指定分支.

最重要的是,我试图找出变更集X是否被移植到那里,可能需要超过1个移植步骤.我知道必要的信息存储在mercurial中(我在篡改mercurial内部时看到它),它只是无法通过命令行界面访问.

Ry4*_*ase 18

这个怎么样:

hg log -r changeset_id -b branchname
Run Code Online (Sandbox Code Playgroud)

如果changeid_id在分支上包含更改,则会给出一些输出branchname,否则不返回任何输出.

如果你想要你可以将它包装在一个bash函数中:

function contains() {
    if [ "$(hg log -r $1 -b $2)" == "" ]
    then
        echo no
    else
        echo yes
    fi
}
Run Code Online (Sandbox Code Playgroud)

这样做:

$ contains 0 default
yes
$ contains 0 other   
no
Run Code Online (Sandbox Code Playgroud)

  • Ry4an:cset中给定分支标记的存在并不意味着此cset是该分支的任何头部的一部分.您可以将分支(包括此cset)合并到另一个分支,也许是"默认",同时保持此分支的其他版本.这意味着我们要查找的cset被标记为属于某个分支,但实际上只能在"默认"分支中看到. (2认同)
  • 至于你的`isKid()`函数 - 它使用修订号而不是OP要求的变更集ID.要使用changest id,它就足以将`-f 1`改为`-f 2` (2认同)

Dor*_*ori 14

使用1.6及更高版本,只需要修改集的功能就可以了

hg log --rev "ancestors(.) and <revNum>"
Run Code Online (Sandbox Code Playgroud)

例如

hg log --rev "ancestors(.) and 1234"
Run Code Online (Sandbox Code Playgroud)

空白表示否,输出表示是,它在您的历史记录中.如果变更集是在命名分支中创建的,那么此处发布的其他一些解决方案将无法工作,即使它稍后在某个时候合并.

  • 非常确定`和revision`应该在*祖先`之外调用:`祖先(.)`将创建当前版本的所有祖先的集合,并且`和`返回2个revsets的交集.`.并且1234`将是一个空集,除非`.`*是*`1234`所以`祖先(.和1234)`将是空集,除非`.`是'1234`.另一方面,`祖先(.)和1234`将给出'祖先(.)`和`set(1234)`的交集,如果`1234`是`.`的祖先,则它是'1234`或者如果不是,则为空集. (3认同)

res*_*esi 6

正如上面的评论中提到的,我试了一下,这是出来的:

http://bitbucket.org/resi/hg-contains/