【问题标题】:Mercurial - How to merge two heads where many files were deleted in one?Mercurial - 如何合并两个头,其中一个删除了许多文件?
【发布时间】:2017-06-23 16:14:48
【问题描述】:

我正在使用一台有两个头的机器:默认和测试。测试是前一段时间从默认创建的分支。不久前,数千个文件从测试中删除。测试中的文件也有很多变化。所有这些在测试中删除或更改的文件也是默认的。我想合并这两个头,以便在测试中更改的所有文件都保持更改,但添加所有已删除且仍处于默认状态的文件。

合并的时候让我一一决定是否保留删除的文件: 本地更改了远程删除的a/b.txt 使用(c)更改版本或(d)删除?

我不介意手动合并有差异的文件,但我不想为已删除的文件按 c 数千次...

【问题讨论】:

    标签: merge mercurial


    【解决方案1】:

    根据您的情况,您可能可以在此处使用:local(或:other)合并工具。

    请注意,这会严格支持一个或其他父级(p1 或 p2)来解决冲突文件,因此与 :merge-local:merge-other 非常不同。也就是说,如果您在分支default 上并且正在合并分支test,并且在两个分支中都修改了文件both.txt(相对于合并基础版本),那么:

    hg merge --tool :local
    

    将完全丢弃test 中的both.txt 更改,仅采用default 中的both.txt 更改。 (如果另一个文件test.txt 仅在test 中被修改,Mercurial 将接受这些更改。)


    但是,如果所有其他方法都失败了,您可以在类 Unix 系统上使用以下技巧模拟在每个提示符中输入 c(我不知道它是否适用于 Windows):

    yes c | hg --config ui.interactive=true merge test
    

    通常,如果hg 的输入来自管道(如在本例中:yes c 打印由c 组成的无限行序列),它不会尝试从其标准输入中读取(这样就好像您在每个提示符下都输入了u)。但是,将 ui.interactive 设置为 true 会强制 Mercurial 无论如何都从标准输入读取。

    如果愿意,您可以将其与 --tool :merge-local--tool :merge-other 结合使用。

    【讨论】:

    • 这听起来非常接近我正在寻找的东西。我想我想要 :local 和 :other 的混合...我希望基本上将 local 用于所有实际冲突,而将 other 用于所有删除。例如,当我进行 hg update test 时,我更新了 83 个文件,合并了 0 个文件,删除了 3645 个文件,未解决 0 个文件。因此,如果我希望将 3645 个文件保留为默认值,而 83 个更新文件将使用来自测试的版本。有没有办法结合 :local 和 :other 来达到这个目的?
    • @Mr.Kaplan:不幸的是,不,没有——至少,如果不写一些 Python 代码就不会。通过扩展接口向 Mercurial 注入新的 Python 代码并不难,注入专用合并应该相当简单,但我还没有真正做到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多