转换Mercurial存储库时重命名标记

时间:2011-10-23 13:21:33

标签: mercurial tags rename

我有一个Mercurial存储库,只想在新的Mercurial存储库中使用其内容的子集。我知道如何使用带有文件映射文件的Convert Extension来执行此操作。

但是,我也喜欢过滤标签,即只保留一个特定于我想要包含的文件。我将能够命名所有这些标签,并且还想重命名它们。换句话说,我也需要一个标签图功能。

我知道我可以排除.hgtags,然后手动添加所有代码或如何rename tags,但我实际上希望保留原始标记日期和修订版,因此转换后的存储库看起来“真实”。

任何想法如何做到这一点?我也不介意编写一些Python代码。

1 个答案:

答案 0 :(得分:3)

如您所知,此功能今天不存在。写它将是一个有趣的小练习:-)你应该从hg接收器的源开始并更改_rewritetags function。它解析data(当前正在转换的变更集的.hgtags文件的内容)并重写变更集哈希值以匹配新的哈希值。

这是您重写或排除代码的机会!我修改了这样的文件,以排除版本2.0以下的标签并稍微重写它们:

def _rewritetags(self, source, revmap, data):
    def keep(tag):
        try:
            version = map(int, tag.split('.'))
            return version >= [2, 0]
        except ValueError:
            return False

    def rename(tag):
        return tag + "-partial"

    fp = cStringIO.StringIO()
    for line in data.splitlines():
        s = line.split(' ', 1)
        if len(s) != 2:
            continue
        if not keep(s[1]):
            continue
        revid = revmap.get(source.lookuprev(s[0]))
        if not revid:
            continue
        fp.write('%s %s\n' % (revid, rename(s[1])))
    return fp.getvalue()

为了进行测试,我还无条件地将self.filemapmode更改为True。否则,convert将不会检测并过滤掉空提交。既然你已经使用了文件地图,那你应该没问题。

最后,删除转换后添加的额外“更新标记”更改集,您将再次获得良好的历史记录。