在尝试计算Kiln和Bamboo之间的集成时,我遇到了一个问题,Fog Creek支持指出可能是我的存储库中有太多拓扑头的问题。我们通常会在合并回主分支之前关闭分支,但很明显会不时被遗忘。
$ hg head -t | grep ^changeset: | wc -l
1361
我的理解是,当从主机Mercurial服务器拉出以了解哪些头需要通过同步时,这些头需要以这种或那种方式进行通信。这是因为超过1100个脑袋对我们来说已经完全死了,所以浪费了很多精力 - 所以我想摆脱那些脑袋!
确定我要消除的头部非常简单:
$ hg log -r "heads(all()) - ( head() and not closed() )" --template "{node}\n" | wc -l
1199
我最初认为清理它是相当简单的:
不幸的是,我遇到了几个问题:
关于我应该如何进行的任何想法或建议?我的迭代合并理念是否合理?从哪个开始比另一个更合理的两个想法之一?
非常感谢任何帮助!
答案 0 :(得分:1)
一些(可能无关的)笔记
hg heads
是可模板化命令,你可以(而不是grep)在head命令中使用-T "{node|short}\n"
或类似命令(输出中的每个变换集的字符串) )<强>解决方案强>
您可以创建临时合并分支(更好 - 从当前提示,见下文)并执行dummy merges所有不需要的|不需要的头进入此合并(虚拟合并是快速和非 - 交互式,即易于自动化),并将合并返回到提示(也可能与虚拟合并肯定,虽然在此步骤中不需要 - 合并头在合并之后根本不会被更改)。
将拓扑头合并到合并中可以(我猜)自动化 - 我无法为您提供完整的工作代码,只有提示:
hg -y merge --tool=internal:fail REV
REV中合并修订的任何标识符(changeset-id,本地修订号),您可以从hg heads -t -T "TEMPLATE"
列表中获取并将其输入xargs ,从上面执行shell脚本答案 1 :(得分:1)
进行无操作合并的最快方法是通过hg debugsetparents
。例如:
hg update REV1
hg debugsetparents . REV2
hg commit -m "No-op merge"
请注意,.
之后的debugsetparents
不是拼写错误,而是指当前结帐的父级。另请注意,hg debugsetparents
允许您对直接祖先执行伪“合并”,这通常不是合并所允许的。虽然这个应该对Mercurial本身没有任何有害影响,但是与存储库交互的其他工具可能会混淆,因此您应该避免滥用hg debugsetparents
,其中一个父修订版将是其中的祖先。其他
其次,请注意,使用--close-branch
关闭已合并的分支通常没什么意义。已关闭的标记实际上仅由hg branches
使用,您可以使用hg branches --active
和hg branches -a
来删除没有活动头的分支(类似地,head() and heads(all()) and not closed()
作为revset for所有未激活或关闭的分支头。因此,一个更简单的解决方案可能是摆脱所有那些仅存在于分支处的拓扑头。