我们正在尝试运行一个 chron 作业,该作业自动将单独的 CVS 模块转换为 mercurial 模块,最后将这些转换后的 mercurial 模块合并到一个单一的 mercurial 存储库中。
我一直在尝试寻找在没有用户窗口提示的情况下自动合并 .hgtags(来自转换后的 hg 存储库)的方法(因此在 chron 作业中使用)。
有没有办法告诉 mercurial 在使用hg merge时只获取本地文件并将其附加到传入文件中?
感谢您提供任何信息或任何建议
我们正在尝试运行一个 chron 作业,该作业自动将单独的 CVS 模块转换为 mercurial 模块,最后将这些转换后的 mercurial 模块合并到一个单一的 mercurial 存储库中。
我一直在尝试寻找在没有用户窗口提示的情况下自动合并 .hgtags(来自转换后的 hg 存储库)的方法(因此在 chron 作业中使用)。
有没有办法告诉 mercurial 在使用hg merge时只获取本地文件并将其附加到传入文件中?
感谢您提供任何信息或任何建议
是的,您可以像 Krtek 描述的那样设置合并工具。我刚试了一下,这行得通:
[merge-tools]
merge-tags.executable = cat
merge-tags.args = $local $other | sort -u >> $output
[merge-patterns]
.hgtags = merge-tags
把它放在.hg/hgrc
服务器上的文件中,以后的合并只会附加标签。会发生什么hg merge
将执行
cat /tmp/hgtags.local /tmp/hgtags.other | sort -u >> .hgtags
其中第一个参数cat
是.hgtags
文件的本地版本,第二个参数是要合并的版本。
我对输出进行排序并使输出唯一,以避免重复两个文件中常见的行。只要您只添加标签,就可以正常工作 - 但如果您还删除标签,那么.hgtags
文件中的行顺序很重要,因此您不能像这样对它进行排序。请参阅我的扩展答案以处理这种情况。
这是我的测试环节。我首先创建一个有两个头的存储库:
$ hg init
$ echo a > a.txt
$ hg add a.txt
$ hg commit -m a
$ echo b > b.txt
$ hg add b.txt
$ hg commit -m b
$ hg tag b
$ hg update 0
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ echo c > c.txt
$ hg add c.txt
$ hg commit -m c
created new head
$ hg tag c
分支在graphlog 扩展的输出中可见:
@ changeset: 4:54c5397a23a4
| tag: tip
| user: Martin Geisler <mg@aragost.com>
| date: Wed Mar 02 11:45:20 2011 +0100
| summary: Added tag c for changeset aff5fe9be7d9
|
o changeset: 3:aff5fe9be7d9
| tag: c
| parent: 0:0db5fae8b6cc
| user: Martin Geisler <mg@aragost.com>
| date: Wed Mar 02 11:45:17 2011 +0100
| summary: c
|
| o changeset: 2:a9af8514a64e
| | user: Martin Geisler <mg@aragost.com>
| | date: Wed Mar 02 11:45:02 2011 +0100
| | summary: Added tag b for changeset 0518533f37f6
| |
| o changeset: 1:0518533f37f6
|/ tag: b
| user: Martin Geisler <mg@aragost.com>
| date: Wed Mar 02 11:44:44 2011 +0100
| summary: b
|
o changeset: 0:0db5fae8b6cc
user: Martin Geisler <mg@aragost.com>
date: Wed Mar 02 11:44:33 2011 +0100
summary: a
文件有冲突.hgtags
:
$ hg cat -r 2 .hgtags
0518533f37f6f37edbea5b46d9af2192f69ddecd b
$ hg cat -r 4 .hgtags
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c
但合并仍然是非交互式的:
$ hg merge
merging .hgtags
1 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
您可以看到文件是如何附加的:
$ cat .hgtags
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c
0518533f37f6f37edbea5b46d9af2192f69ddecd b
sort -mu
给了我想要的。此命令不排序,但删除重复项。
sort -u
打破时间顺序。
仅当您的 .hgtags 文件中存在冲突时才会出现窗口提示,这种情况应该很少见。但是,这可能是一个可行的想法。
Mercurial 允许您使用与内部工具不同的合并工具,有关更多信息,请参阅MergeToolConfiguration。您还可以通过带有--tool
选项的命令行更改合并工具(请参阅参考资料hg merge --help
)。
也许您可以编写一些小程序作为 .hgtags 的特殊合并工具,它可以完全按照您的要求进行操作,即将本地文件附加到传入文件中。然后,您可以修改 hgrc 以在合并 .hgtags 时使用这个新工具。
我从未尝试过此解决方案,这只是一个想法,但也许会对您有所帮助。
这是python中的一个简单的合并工具。它还尝试维护 .hgtags 文件中现有的行顺序。
与马丁的回答相同的警告适用。
import sys
from heapq import merge
local = sys.argv[1]
other = sys.argv[2]
output = sys.argv[3]
merged_tags = merge(file(local).readlines(), file(other).readlines())
unique_tags = []
for tag in merged_tags:
if tag not in unique_tags:
unique_tags.append(tag)
file(output, 'w').writelines(unique_tags)
https://stackoverflow.com/a/9783478/1183010中的建议:
hgtags.merge.template: changeset = "{tags}" tag = "{node} {tag}\n"
[合并工具] hgtags.executable = hg hgtags.args = log -r "tagged()" --style hgtags.merge.template > $output hgtags.premerge = False
[合并模式] .hgtags = hgtags
为我们工作。