我们正在使用Mercurial进行源代码管理,并希望为我们的质量检查流程引入自动合并和更改日志。 出于本讨论的目的,我们假设我们使用如下所示的简单3分支流程:
DAOFactory OracleDbFactory =
DAOFactory.getDAOFactory(DAOFactory.DAOORACLEDB);
// Create a DAO
CustomerDAO custDAO =
OracleDbFactory.getCustomerDAO();
所以问题是: 是否有可能构造一个revset查询,在合并N时,最好在实际执行之前,但在实际执行之后,将导致默认分支上的所有提交的日志,这些提交尚未在QA分支中(在上图中,是A和B)。
或者配方: 是否可以构造一个将返回所有变更集的revset查询,如果我们将Default合并到QA中,它将被合并。
我只对默认分支上的提交感兴趣,而不是已经合并到Default(功能分支未包含在图形中)的功能分支中的单个提交。我对QA分支的提交也不感兴趣。
存储库维护得很好,但是有几年的历史,包含大约13000个节点。
我一直在尝试祖先和祖先,但要么我将X作为最新的共同祖先,要么是非常非常老的节点。我理解获得X的逻辑,但我真的在追求O。
我所拥有的最大的运气就是变化:
\ = forward merge
| = back merge of fix
Default --O--A--*--B--*---
\ ^ \
\ | \
QA -----M--X--C--*--N---
^ \
| \
Master --------H--------*---
更新
根据Tom的建议,使用“hg merge --preview --rev XYZ”生成如下输出:
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'))"
不是太糟糕,但也不是超级好玩。至少它需要比简单的grep / sl更多的逻辑来解析。
提前致谢, 约翰
答案 0 :(得分:1)
我找到了一个主要做我想要的解决方案:
hg log --rev "branch('Default') & !ancestors(branch('QA')) & ancestors(heads(branch('Default')) & !closed()) & !children(branch('QA'))"
现在唯一缺少的是排除多个头合并,因为它们只是更改日志中的噪音。
更新
所以我再次选择了这个项目,并在其他地方找到了一些很好的答案。
以下产生类似于hg merge --preview的输出,但可以模板化:
hg log -r "ancestors('$sourceBranch') - ancestors(.)" --template $template
这会筛选出不在源分支上的所有提交:
hg log -r "(ancestors('$sourceBranch') - ancestors(.)) and (branch('$sourceBranch'))" --template $template