是否自动合并或连接hgtags(Mercurial)?
我们正在尝试运行一个chron作业,自动将单独的CVS模块转换为mercurial模块,并最终将这些转换后的mercurial模块整合到单个mercurial repo中 我一直在努力寻找方法来自动合并.hgtags(来自转换的hg repos),而无需用户窗口提示(因此在chron作业中使用) 使用hg merge时,有没有办法告诉mercurial只获取本地文件并将其附加到传入文件是否自动合并或连接hgtags(Mercurial)?,mercurial,merge,dvcs,merge-conflict-resolution,.hgtags,Mercurial,Merge,Dvcs,Merge Conflict Resolution,.hgtags,我们正在尝试运行一个chron作业,自动将单独的CVS模块转换为mercurial模块,并最终将这些转换后的mercurial模块整合到单个mercurial repo中 我一直在努力寻找方法来自动合并.hgtags(来自转换的hg repos),而无需用户窗口提示(因此在chron作业中使用) 使用hg merge时,有没有办法告诉mercurial只获取本地文件并将其附加到传入文件 感谢您提供的任何信息或建议只有在.hgtags文件中出现冲突时才会出现窗口提示,这应该是非常罕见的。然而,这里
感谢您提供的任何信息或建议只有在.hgtags文件中出现冲突时才会出现窗口提示,这应该是非常罕见的。然而,这里可能有一个可行的想法 Mercurial允许您使用与内部合并工具不同的合并工具,有关更多信息,请参阅。您还可以通过命令行使用
--tool
选项更改mergetool(请参阅hgmerge--help
)
也许您可以编写一些小程序,作为.hgtag的特殊合并工具,它可以实现您想要的功能,即将本地文件附加到传入文件中。然后,您可以修改hgrc以在合并.hgtags时使用此新工具
我从未尝试过这个解决方案,这只是一个想法,但也许它会帮助你。是的,你可以像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
这些分支在以下对象的输出中可见:
但合并仍然是非交互式的:
$ 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
这里有一个简单的python合并工具。它还尝试保持.hgtags文件中现有的行顺序 与马丁的回答相同的警告也适用 导入系统 从heapq导入合并 本地=系统argv[1] 其他=系统argv[2] 输出=系统argv[3] merged_tags=merge(文件(本地).readlines(),文件(其他).readlines()) 唯一的_标记=[] 对于合并的\u标记中的标记: 如果标签不在唯一标签中: 唯一标记。附加(标记) 文件(输出“w”).writelines(唯一的\u标记)
sort-mu
给了我想要的东西。此命令不排序,但删除重复项
排序-u
打破时间顺序。以下建议:
hgtags.merge.template:changeset=“{tags}”tag=“{node}{tag}\n”
[合并工具]hgtags.executable=hg hgtags.args=log-r“taged()”
--style hgtags.merge.template>$output hgtags.premerge=False
[合并模式].hgtags=hgtags
对我们有用。出于好奇,为什么要用cron作业转换CVS回购?@Oben:Incremental conversion。我在SVN->Hg(减去回购组合)中也做了同样的操作。谢谢,看起来这可能是solution@NickHodges我编写了一个基本的C#exe,可以作为windows上cat的替代程序:
$ 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