【问题标题】:How do I deal with closed topological heads in Mercurial?如何处理 Mercurial 中的封闭拓扑头?
【发布时间】:2015-09-22 06:00:06
【问题描述】:

在尝试解决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. 迭代地将所有封闭的拓扑头合并到虚拟分支中(保持本地)

不幸的是,我遇到了几个问题:

  • 如果我从当前的默认 head 启动虚拟分支,合并需要很长时间(我估计完成所有 1100 多个合并需要数周时间)
  • 如果我从变更集 0 开始,我很快就会遇到我不知道如何解决的模棱两可的合并问题(“模棱两可的合并 - 选择 m 动作”?)

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

非常感谢任何帮助!

【问题讨论】:

    标签: merge mercurial


    【解决方案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() 作为所有不活动的分支头的修订集或关闭)。因此,一个更简单的解决方案可能是去掉所有那些只为关闭分支而存在的拓扑头。

    【讨论】:

    • 谢谢@Reimer Behrends - 你能澄清你的第一段吗?你的建议对我来说是有道理的,但你却大声疾呼“你应该避免这样做”。
    • “避免这样做”部分是关于使用debugsetparents 与祖先进行合并。我将重写以澄清这部分。
    • 啊,谢谢 - 我不认为我会遇到这个问题,因为我只是将一堆悬空的头合并到这个虚拟分支中(根据定义,头不是任何东西的祖先)。
    • 快速跟进——这种方法对我来说效果很好。我在一两分钟内关闭了 1100 多个坏头,现在我的 HTTP 拉取请求要小得多。再次感谢您的帮助。
    【解决方案2】:

    一些(可能不相关的)注释

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

    解决方案

    可以创建临时合并分支(更好 - 从当前提示,见下文)并执行 dummy merges 所有不需要的|不需要的头进入此合并(虚拟合并快速且非交互式,即容易自动化),并将 Merger 合并回尖端(当然也可以使用虚拟合并,虽然在此步骤中不需要 - 在所有合并后根本不会更改合并头)。

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

    1. wiki 的三行代码可用作带有单个参数“REV 合并”的 shell 脚本

    2. hg -y merge --tool=internal:fail REV REV 是合并修订的any标识符(变更集ID,本地修订号),您可以从hg heads -t -T "TEMPLATE" 列表中获取并将其通过管道传输到xargs,从上面执行shell脚本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多