无论如何要自动合并或连接hgtags(Mercurial)?

我们正在尝试运行一个chron作业,自动将单独的CVS模块转换为mercurial模块,最后将这些转换后的mercurial模块合并到一个mercurial repo中。 我一直试图找到自动合并.hgtags(来自转换后的hg repos)的方法,而不需要用户窗口提示(因此在chron作业中使用)。 当使用hg merge来获取本地文件并将其附加到传入文件时,有没有办法告诉mercurial? 感谢任何信息或任何建议     
已邀请:
是的,您可以设置像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
选项通过命令行更改mergetool(参见
hg merge --help
)。 也许您可以编写一些小程序作为.hgtags的特殊合并工具,它可以完全按照您的要求进行操作,即将本地文件附加到传入文件中。然后,您可以在合并.hgtags时修改hgrc以使用此新工具。 我从来没有尝试过这个解决方案,这只是一个想法,但也许它会帮助你。     
这是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”      [merge-tools] hgtags.executable = hg hgtags.args = log -r“tagged()”   --style hgtags.merge.template> $ output hgtags.premerge = False      [merge-patterns] .hgtags = hgtags 适合我们。     

要回复问题请先登录注册