6

我们正在尝试运行一个 chron 作业,该作业自动将单独的 CVS 模块转换为 mercurial 模块,最后将这些转换后的 mercurial 模块合并到一个单一的 mercurial 存储库中。

我一直在尝试寻找在没有用户窗口提示的情况下自动合并 .hgtags(来自转换后的 hg 存储库)的方法(因此在 chron 作业中使用)。

有没有办法告诉 mercurial 在使用hg merge时只获取本地文件并将其附加到传入文件中?

感谢您提供任何信息或任何建议

4

5 回答 5

8

是的,您可以像 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
于 2011-03-02T10:59:26.470 回答
3

sort -mu给了我想要的。此命令不排序,但删除重复项。

sort -u打破时间顺序。

于 2012-10-08T13:02:46.157 回答
2

仅当您的 .hgtags 文件中存在冲突时才会出现窗口提示,这种情况应该很少见。但是,这可能是一个可行的想法。

Mercurial 允许您使用与内部工具不同的合并工具,有关更多信息,请参阅MergeToolConfiguration。您还可以通过带有--tool选项的命令行更改合并工具(请参阅参考资料hg merge --help)。

也许您可以编写一些小程序作为 .hgtags 的特殊合并工具,它可以完全按照您的要求进行操作,即将本地文件附加到传入文件中。然后,您可以修改 hgrc 以在合并 .hgtags 时使用这个新工具。

我从未尝试过此解决方案,这只是一个想法,但也许会对您有所帮助。

于 2011-03-01T16:54:02.263 回答
1

这是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)
于 2011-11-24T07:25:47.390 回答
0

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

为我们工作。

于 2013-03-20T13:00:32.997 回答