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

时间:2009-11-05 15:40:19

标签: mercurial

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

hg contains [-r branch] changeset_id

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

我知道“debugancestor”命令,但是“是/否”的答案更容易阅读。

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

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

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

6 个答案:

答案 0 :(得分:18)

这个怎么样:

hg log -r changeset_id -b branchname

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

如果您愿意,可以将其包装在bash函数中:

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

这样做:

$ contains 0 default
yes
$ contains 0 other   
no

答案 1 :(得分:14)

使用1.6及更高版本,你需要的是版本集的强大功能

hg log --rev "ancestors(.) and <revNum>"

例如

hg log --rev "ancestors(.) and 1234"

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

答案 2 :(得分:6)

如上面的评论所述,我试了一下,这就是出现的结果:

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

答案 3 :(得分:2)

将debugancestor的结果转换为yes或no是非常容易的(但是肯定没有内置的方法可以做到这一点;已经编写了一个脚本!)。请注意,如果分支具有多个分支头,则答案可能是错误的。

(编写一个扩展来添加命令来执行此操作也应该是非常重要的,顺便说一下。)

答案 4 :(得分:0)

你总是可以打印出该版本的分支名称(如果它是默认值,它将是空的)然后根据你想要的任何东西(用bash或某种脚本语言)测试:

hg log --template '{branches}' -r <revision name/number>

答案 5 :(得分:0)

我测试了上述大多数方法,但没有奏效。扩展名&#39;包含&#39;某种程度上错误的修改(我认为它是一个错误),hg log --rev&#34;祖先(。)和1234&#34;工作,但我找到了更简单的方法:

hg merge -P <changeset>

将显示是否有任何未合并的内容(它还将包含不是所涉及的变更集的合并父项的变更集)