gpt4 book ai didi

mercurial - 如何在 Mercurial 中自动 merge .hgtags?

转载 作者:行者123 更新时间:2023-12-03 01:10:34 43 4
gpt4 key购买 nike

我有一个脚本在构建服务器上以非交互模式运行一些 Mercurial 命令。其中一个命令 merge 两个分支,并且由于构建脚本的设置方式,在 merge 期间 .hgtags 文件中始终存在冲突。

如何强制 Mercurial 始终使用两个文件的更改来 merge .hgtags 文件,首先是一个文件的更改,然后是另一个文件的更改?

例如,如果我要 merge 的文件是

A
B
C

A
B
D

我希望结果是

A
B
C
D

我猜我需要一个自定义 merge 工具。什么工具提供此功能?

最佳答案

请参阅 answer below由 Magras de La Mancha 提供的 Mercurial 3.1 更好的解决方案。下面是针对旧版本 Mercurial 的更简单、更简单的解决方案。

<小时/>

是的,您需要配置自定义 merge tool对于您的 .hgtags 文件。 Mercurial 没有为 .hgtags 提供任何特殊的 merge 工具,您需要使用普通的三向 merge 工具手动 merge 它。

.hgtags 文件中的冲突可以有两种类型:

  • 愚蠢的冲突:这就是您遇到的情况,这里并没有真正的冲突。发生的情况是一个分支有

    f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
    0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
    12e0fdbc57a0be78f0e817fd1d170a3615cd35da C

    另一个分支有

    f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
    0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
    979c049974485125e1f9357f6bbe9c1b548a64c3 D

    每个标签都引用一个变更集,因此这里不存在冲突。 merge 当然应该是两个文件的:

    f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
    0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
    12e0fdbc57a0be78f0e817fd1d170a3615cd35da C
    979c049974485125e1f9357f6bbe9c1b548a64c3 D
  • 真正的冲突:有一个分支有

    f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
    0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
    12e0fdbc57a0be78f0e817fd1d170a3615cd35da C

    另一个分支有

    f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
    0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
    979c049974485125e1f9357f6bbe9c1b548a64c3 C

    这里存在真正的冲突:hg tag C 是在两个分支上完成的,但标签引用了不同的变更集。解决这个问题是一项手动任务。

如果您可以保证只会出现愚蠢的冲突并且每个变更集只有一个标签,那么您可以使用

hg log -r "tagged()" --template "{node} {tags}\n" > .hgtags

生成新的.hgtags文件。关键的见解是 Mercurial 知道如何在内部 merge 标签!当您有两个带有不同 .hgtags 文件的头时,它总是会执行此操作。上面的模板只是根据此内部 merge 生成一个新的 .hgtags 文件。

如果每个变更集可能有多个标签,那么上述方法将不起作用 - 所有标签都打印在一行上,因此您会得到一个标签 foo bar 而不是两个标签 foo 。然后您可以使用这个 style file相反:

changeset = "{tags}"
tag = "{node} {tag}\n"

每个标签输出一行,而不是变更集。您将此样式保存在某处并配置 merge 工具:

[merge-tools]
hgtags.executable = hg
hgtags.args = log -r "tagged()" --style ~/tmp/tags-style > $output
hgtags.premerge = False
hgtags.priority = -1000

[merge-patterns]
.hgtags = hgtags

您现在可以自动 merge 标签了。有一些注意事项:

  1. 三个或更多头:只有在 merge 时有两个头时,该技术才有效。如果您有三个或更多头,则已删除的标签可能会重新出现。如果您有 X、Y 和 Z 头,并且 X 中的标签 A 被删除,那么 Mercurial 通常能够确定 A 被整体删除。它基于 X 中 .hgtags 文件中的 000...0 A 行来执行此操作。但是,如果 merge X 和 Y 以获得 W,则该方法建议不会包含任何此类 000...0 A 行。 Z 中的 A 定义现在将突然生效并重新引入 A

  2. 真正的冲突:如果.hgtags中存在真正的冲突,那么上述方法将默默地从最近的头部中选择标签 为你。 merge 工具基本上将hg标签保存在.hgtags中,具有多个头的hg标签的行为是explained in the wiki 。由于 hgtags 无条件读取并默默地 merge 所有头中的 .hgtags 文件,因此我们对此简单的方法无能为力。处理这个问题需要一个更大的脚本来读取两个 .hgtags 文件并检测冲突。

关于mercurial - 如何在 Mercurial 中自动 merge .hgtags?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9782383/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com