使用 mercurial 生成合并日志
Generating merge logs with mercurial
我们使用 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 查询,它将 return 所有变更集,如果我们将 Default 合并到 QA 中,这些变更集将被合并。
我只对默认分支上的提交感兴趣,而不是已经合并到默认分支中的单个提交(功能分支未包含在绘图中)。我对 QA 分支上的提交也不感兴趣。
存储库维护得很好,但已经有几年历史了,包含大约 13000 个节点。
我一直在试验 ancestor 和 ancestors,但要么我得到 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 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
我们使用 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 查询,它将 return 所有变更集,如果我们将 Default 合并到 QA 中,这些变更集将被合并。
我只对默认分支上的提交感兴趣,而不是已经合并到默认分支中的单个提交(功能分支未包含在绘图中)。我对 QA 分支上的提交也不感兴趣。
存储库维护得很好,但已经有几年历史了,包含大约 13000 个节点。
我一直在试验 ancestor 和 ancestors,但要么我得到 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 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