在错误的方向找到合并

时间:2013-11-11 21:55:31

标签: mercurial

我们每年有三个主要版本,共同响应分支机构:例如2013A,2013B和2013C。当我们创建每个分支时,它从默认启动。 每个分支的更改只应合并转发,例如2013A - > 2013B - > 2013C - >默认。我们在服务器上有一个推钩,用于检查推送的合并是否方向错误,即默认 - > 2013C,2013C - > 2013B等。

我们还有特定于团队的分支机构,其中一些分支机构负责发布功能,另一些分支机构正在处理下一个版本,例如:默认。当一个团队正在开发一个版本时,他们会与发布分支合并。当团队准备好在下一个版本上工作时,他们就会开始与默认分支合并。

前几天,我们遇到一个情况,即新的开发人员在团队准备好进入下一个版本之前将默认值合并到他的团队分支中,然后将团队分支合并到之前的版本,即默认 - > TeamBranch - > 2013B。不幸的是,我们的钩子没有考虑到这种情况。

基本上,这就是发生的事情:

2013B       A---o---o---o---o---B---o
           /     \             /     \
Team      /       o---o---o---C---o---o
         /                   /         \  
Default D---o---o---o---o---o---o---o---o

A =创建2013B分行
B =合并到发布分支
C =糟糕的合并。每当我们合并到一个发布分支时,我们都希望检测并阻止它们 D =发布分支的第一个共同祖先,默认为。

所以,我重新编写了我们的钩子来检查当一个更改合并到一个发布分支时,它不会向后合并。对于每次合并到发布分支,我检查没有任何祖先从前向分支合并。这是我正在使用的revset查询:

> hg log -r "limit(descendants(p1(first(branch('2013B')))) and reverse(p2(ancestors(branch('2013B'))) and branch('default')),1)"

这很有效。但是,我们有一个大型存储库(111,000 +更改集),检查需要30到40秒。 我想知道是否有更快/更快/更有效的方式来编写我的revset查询,或者我没有看到的其他方法。

2 个答案:

答案 0 :(得分:2)

我将同样的问题发送到Mercurial邮件列表并收到答复。 branch()查询是性能瓶颈。它会导致Mercurial展开分支上的所有变更集。 Mercurial不会缓存此结果,因此每次调用都将展开更改集。

我改为使用branch()descendants()而不是ancestors()

limit(children(p2(2013BBaseline:: and ::2013B and merge()) and branch(default)) and reverse(::2013B))
  • p2(2013BBaseline:: and ::2013B and merge()) and branch(default)抓取第二个父(传入分支),查找2013B分支的开头与其头部之间的所有合并,并返回默认分支上的那些。 [1]
  • 上面的条款然后用children()包裹,然后再回到父母的子女身上。
  • and reverse(::2013B)然后获取作为2013B分支的祖先的子项,即错误的合并。
  • limit()然后返回第一个错误的合并。

上面的查询大约需要1.5秒。

感谢Matt Mackall建议的解决方案。

  1. 2013BBaseline是一个标记,用于标识创建default分支的2013B分支中的变更集,否则我将不得不将2013BBaseline::替换为p1(first(branch(2013B)))::

    {{1}}

    发现发布分支的基线,但效率不高。

答案 1 :(得分:0)

要检测合并C,您应该可以使用

$ hg log -r "parents(branch(Team) and merge()) and branch(default)"

这为您提供了合并到default的{​​{1}}上的更改集。如果有,那么有人会错误地合并到他们的团队分支。我认为你需要从团队分支的角度来攻击这个:你不能禁止与发布分支的合并,因为其中一些是合法的。

如果您的团队分支遵循一致的命名方案(他们应该),那么您可以使用带有Team谓词的正则表达式来选择它们。像

这样的东西
branch()

会匹配以$ hg log -r "branch('re:team-.*')" 开头的分支。