2011-10-23 53 views
3

我有一个Mercurial存储库,并且只需要在新的Mercurial存储库中存储其内容的子集。我知道如何使用带有文件映射文件的Convert Extension来执行此操作。转换Mercurial存储库时重命名标签

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

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

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

+0

我不确定订单是如何保存的,但是您可以指定您想要记录标签的日期,因为当您使用-d或--date创建标签时?它并不能完全解决它所进行的修改,但它确实可以让你将日期设置为你想要的。 –

+0

@TrentonSchulz:谢谢。我知道'--date',并在之前使用它。这实际上是我的备份计划。 –

+1

你能结合一个按日期排序的转换,而不是按分支吗? –

回答

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.filemapmodeTrue无条件。否则,convert不会检测并过滤掉空的提交。既然你已经使用了一个文件映射,你应该没问题。

最后,除去convert中添加的额外“更新标签”变更集,您将再次获得一个不错的历史记录。