- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个脚本在构建服务器上以非交互模式运行一些 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 标签了。有一些注意事项:
三个或更多头:只有在 merge 时有两个头时,该技术才有效。如果您有三个或更多头,则已删除的标签可能会重新出现。如果您有 X、Y 和 Z 头,并且 X 中的标签 A
被删除,那么 Mercurial 通常能够确定 A
被整体删除。它基于 X 中 .hgtags
文件中的 000...0 A
行来执行此操作。但是,如果 merge X 和 Y 以获得 W,则该方法建议不会包含任何此类 000...0 A
行。 Z 中的 A
定义现在将突然生效并重新引入 A
。
真正的冲突:如果.hgtags
中存在真正的冲突,那么上述方法将默默地从最近的头部中选择标签 为你。 merge 工具基本上将hg标签
保存在.hgtags
中,具有多个头的hg标签
的行为是explained in the wiki 。由于 hgtags
无条件读取并默默地 merge 所有头中的 .hgtags
文件,因此我们对此简单的方法无能为力。处理这个问题需要一个更大的脚本来读取两个 .hgtags
文件并检测冲突。
关于mercurial - 如何在 Mercurial 中自动 merge .hgtags?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9782383/
我可以知道拥有 .hgtags 的目的是什么吗?我可以删除它吗?因为它不在 .hg文件夹,似乎“污染”了我的实际源代码目录。 https://bz.mercurial-scm.org/show_bug
我无法解决 .hgtags 的冲突 kd:friend-sup/ $ cat .hgtags >>>>>> OTHER 我尝试以各种方式编辑文件,删除标记,但无济于事。理想情况下,我想要来自“我的”和
如果您要将存储库 B 中的更改 merge 到存储库 A 中,是否应该 merge .hgtags 中的更改? 存储库 B 可能具有 A 中没有的标签 1.01、1.02、1.03。为什么要将这些 m
我有一个脚本在构建服务器上以非交互模式运行一些 Mercurial 命令。其中一个命令 merge 两个分支,并且由于构建脚本的设置方式,在 merge 期间 .hgtags 文件中始终存在冲突。 如
我们正在尝试运行一个 chron 作业,自动将单独的 CVS 模块转换为 Mercurial 模块,最后将这些转换后的 Mercurial 模块 merge 到单个 Mercurial 存储库中。 我
几周前有人在 merge .hgtags 时不小心弄坏了他们的 l 键,我们开始收到有关 .hgtags@eed03ad8bbe7,第 1 行:节点 'll005a7e9815cb34a143f349
几周前有人在 merge .hgtags 时不小心弄坏了他们的 l 键,我们开始收到有关 .hgtags@eed03ad8bbe7,第 1 行:节点 'll005a7e9815cb34a143f349
我是一名优秀的程序员,十分优秀!