我想知道是否有一个mercurial命令/扩展只测试给定的变更集是否在分支中。该命令将类似于:
hg contains [-r branch] changeset_id
并应检查给定的变更集是否在当前/给定分支中,只返回“是”或“否”。
我知道“debugancestor”命令,但是“是/否”的答案更容易阅读。
如果有,是否可以检查移植的变更集?
编辑:场景位于repo中,其中命名分支有多个头。让我们说一个分支被命名为“dev-X”,具有超过1个头和更长的历史,至少用各种图形可视化跟踪它。 我想弄清楚分支“dev-X”中的变更集X是否合并到另一个“dev-X”的头部。因此,我不能使用分支名称,只能使用变更集编号/哈希来指定分支。
最重要的是,我试图找出变更集X是否被移植到那里,可能需要超过1个移植步骤。我知道必要的信息存储在mercurial中(我在篡改mercurial内部时已经看过它),它只是无法通过命令行界面访问。
答案 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)
如上面的评论所述,我试了一下,这就是出现的结果:
答案 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>
将显示是否有任何未合并的内容(它还将包含不是所涉及的变更集的合并父项的变更集)