【问题标题】:How can I force hg merge to be interactive?如何强制 hg merge 进行交互?
【发布时间】:2012-07-26 23:58:56
【问题描述】:

作为 MSBuild 作业的一部分,我正在 CruiseControl.NET 下运行自动 hg 合并。由于某种原因,即使我没有在命令中指定-y,合并也会在非交互模式下运行。这会导致意外结果,因为当提示冲突时它采用第一个选项,我宁愿它只是超时并失败,所以我们知道我们需要手动查看它。

所以两个问题:

1) 为什么在我没有给它-y 时它会以非迭代方式运行?
2) 有没有办法强制 hg 合并是交互式的,这样作业就会超时并失败?

【问题讨论】:

  • 我打赌它检测到它没有连接控制台并且做的是理智的事情 - 忽略交互模式。
  • 我也这么认为,但我不知道它如何或为什么检测到它正在无头运行,也不知道我能做些什么来覆盖它。
  • 我能够确认在 MSBuild 中运行 hg 会使其以非交互模式运行。我还可以通过强制它在 MSBuild 中的单独命令窗口中运行,使其以交互方式运行,如下所示:“start cmd /k " &quote;”。但是,这会挂起并失败,然后使 repo 处于混乱、未解决的状态,这会使其他构建脱离轨道。虽然我得到了我想要的,但这不是我需要的。我将尝试通过在 PoweShell 而不是 MSBuild 中执行此操作来解决此问题。感谢大家的帮助。

标签: mercurial msbuild merge cruisecontrol.net interactive


【解决方案1】:

基于this answer on another question,看起来 Mercurial 会自动检测它是在 TTY 下运行还是无头,因此不会提示您。您可以通过提供 ui.interactive 配置选项来覆盖它:

hg --config ui.interactive=yes

【讨论】:

    【解决方案2】:

    我认为更好的主意是使用hg merge --tool internal:merge。 Mercurial 将尝试进行自动合并,但如果有任何冲突将失败。这里有other options 可能。

    在从外部 ClearCase 存储库自动提取后,我每天都在使用它,它工作得很好。如果有任何冲突,我的 CI 工作就会立即失败。

    【讨论】:

    • 谢谢,我会尝试,但我不知道它是否会覆盖我试图停止的非交互行为。
    • 它没有,仍然运行非交互式:(我尝试了你链接中的其他一些选项,也没有运气。部分问题可能是我遇到了清单合并,不仅仅是文件合并。例如,文件在源中被修改但在目标中被删除。这些处理方式不同,我认为在基本的内部合并尝试发生之前就会出现提示。
    • Mercurial v 2.1.1 作为 TortoiseHg 2.3.1 (x64)、CCnet v 1.6.7981.1、MSBuild Microsoft (R) Build Engine 版本 4.0.30319.1 的一部分安装。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多