如何处理Mercurial中的封闭拓扑头?

时间:2015-09-22 06:00:06

标签: merge mercurial

在尝试计算KilnBamboo之间的集成时,我遇到了一个问题,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

我最初认为清理它是相当简单的:

  1. 创建一个新的虚拟分支
  2. 迭代地将所有封闭的拓扑头合并到虚拟分支(保持本地)
  3. 不幸的是,我遇到了几个问题:

    • 如果我从我当前的默认头开始虚拟分支,合并需要很长时间(我估计需要几周才能完成所有1100多次合并)
    • 如果我从变更集0开始,我会很快遇到一个模糊的合并问题,我不知道如何解决("模糊合并 - 选择m动作"?)

    关于我应该如何进行的任何想法或建议?我的迭代合并理念是否合理?从哪个开始比另一个更合理的两个想法之一?

    非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

一些(可能无关的)笔记

  • 合并的分支不会产生拓扑头,因此 - 在合并它之前关闭分支只是浪费时间,我认为大多数1361个头只被忽略和废弃的分支(并且这是"坏习惯")
  • 不需要管道输出grep head输出:hg heads是可模板化命令,你可以(而不是grep)在head命令中使用-T "{node|short}\n"或类似命令(输出中的每个变换集的字符串) )

<强>解决方案

可以创建临时合并分支(更好 - 从当前提示,见下文)并执行dummy merges所有不需要的|不需要的头进入此合并(虚拟合并是快速和非 - 交互式,即易于自动化),并将合并返回到提示(也可能与虚拟合并肯定,虽然在此步骤中不需要 - 合并头在合并之后根本不会被更改)。

将拓扑头合并到合并中可以(我猜)自动化 - 我无法为您提供完整的工作代码,只有提示:

  1. 来自wiki的三线程可以用作shell脚本,单个参数&#34; REV合并&#34;
  2. 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 --activehg branches -a来删除没有活动头的分支(类似地,head() and heads(all()) and not closed()作为revset for所有未激活或关闭的分支头。因此,一个更简单的解决方案可能是摆脱所有那些仅存在于分支处的拓扑头。