【问题标题】:Generating merge logs with mercurial使用 mercurial 生成合并日志
【发布时间】:2017-12-18 22:01:30
【问题描述】:

我们正在使用 Mercurial 进行源代码控制,并希望为我们的 QA 流程引入自动合并和更改日志。 出于讨论的目的,我们假设我们使用一个简单的 3 分支流程,如下所示:

\ = forward merge
| = back merge of fix

Default --O--A--*--B--*---
           \    ^      \
            \   |       \
QA      -----M--X--C--*--N---
                ^      \ 
                |       \
Master  --------H--------*---  

所以问题是: 是否可以构建一个 revset 查询,在合并 N 时,最好在实际执行之前但在实际执行之后,将导致默认分支上所有提交的日志,这些提交尚未在 QA 分支中(在上图中,是 A 和 B)。

另一种表述: 是否可以构造一个 revset 查询来返回所有变更集,如果我们将 Default 合并到 QA 中,这些变更集将被合并。

我只对 Default 分支上的提交感兴趣,而不是已经合并到 Default 中的功能分支中的单个提交(图中未包含功能分支)。我也对 QA 分支上的提交不感兴趣。

存储库维护得很好,但已有几年历史,包含大约 13000 个节点。

我一直在试验祖先和祖先,但要么我得到 X 作为最新的共同祖先,要么是一些非常非常古老的节点。我理解得到X的逻辑,但我真的在追求O。

我最幸运的就是这种变化:

hg log --rev "((heads(branch('Default')) and !closed()) % heads(branch('QA'))) and branch('Default') and p2(!branch('QA'))"
hg log --rev "((heads(branch('Default')) and !closed()) % heads(branch('QA'))) and branch('Default') and !children(branch('QA'))"

更新

按照 Tom 的建议,使用“hg merge --preview --rev XYZ”会生成如下输出:

changeset:   13070:7e59fc16aa4e
branch:      Default
parent:      13068:5b9409ad504f
parent:      13069:849bd43d2023
user:        *******
date:        Mon Dec 18 18:40:46 2017 +0200
summary:     Merged Feature branch A

changeset:   13071:07470ff919ff
branch:      Feature branch B
parent:      13061:540eda2c959b
parent:      13068:5b9409ad504f
user:        *****
date:        Mon Dec 18 18:49:42 2017 +0200
summary:     Merge with Default

changeset:   13072:a53260ffabca
branch:      Feature branch B
user:        *****
date:        Mon Dec 18 18:58:05 2017 +0200
summary:     Some text

changeset:   13073:37c895f2abf0
branch:      Default
parent:      13070:7e59fc16aa4e
parent:      13072:a53260ffabca
user:        *******
date:        Mon Dec 18 18:58:05 2017 +0200
summary:     Merged Feature branch B

还不错,但也不是很有趣。至少它需要比简单的 grep/sls 更多的逻辑来解析。

提前致谢, 约翰

【问题讨论】:

  • 不会合并预览给你你想要的吗?例如。 hg更新-b QA; hg merge -P -r REV
  • 合并预览返回所有功能分支上的每个提交,以及这些功能分支的合并提交。它也没有 --template 选项,所以我必须按原样解析输出。您的评论确实让我重新访问了我在搜索早期放弃的合并权限,因为我确信我可以使用 hg log 做得更好。现在我认为解析预览日志以找到默认分支上的第一个节点,然后在此基础上使用 hg 日志,可以工作。
  • 简单的grep:hg merge -P -r REV | grep --before-context 1 'branch:.*Default' | grep 变更集
  • 当然可以解析,但对于更改日志,我想包含摘要,甚至更好的是描述。我考虑从合并预览中获取所有节点ID,然后获取每个节点的详细信息,但这感觉就像失败:) 正如我的回答中提到的,我现在有一些可行的方法,尽管我还有一些其他类似的场景仍然很复杂。

标签: mercurial changelog mercurial-revsets


【解决方案1】:

我找到了一个主要满足我需求的解决方案:

hg log --rev "branch('Default') & !ancestors(branch('QA')) & ancestors(heads(branch('Default')) & !closed()) & !children(branch('QA'))"

现在唯一缺少的是排除多个头部合并,因为它们只是变更日志中的噪音。


更新:

所以我再次选择了这个项目,并在 SO 的其他地方找到了一些很好的答案。

以下产生类似于 hg merge --preview 的输出,但可以模板化:

hg log -r "ancestors('$sourceBranch') - ancestors(.)" --template $template

这会过滤掉所有不在源分支上的提交:

hg log -r "(ancestors('$sourceBranch') - ancestors(.)) and (branch('$sourceBranch'))" --template $template

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 2011-04-04
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多