我正在将一个大的(大约9000个更改集)Subversion存储库转换为Mercurial。它与Trac问题跟踪系统相结合,因此提交日志有许多对其他修订ID和票号的交叉引用。
我正在尝试hgsubversion并转换扩展名。两者似乎都适用于我们的存储库,但提交日志中引用的修订ID不会被转换。
(Trac部分相当简单 - 我们只需扫描数据库并转换所有出现的修订版ID参考。)
所以,我修改了转换扩展的源代码,如下所示:
(hg.py中的mercurial_sink
类)
def _rewritedesc(self, desc, source, revmap):
# Only for subversion source.
# We assume that no future revision is mentioned in commit logs.
rx_revision = re.compile(r'(r(\d+)|\[(\d+)\])') # it's actually defined in module header.
def replacer(m):
if m is None:
return m.group(0)
new_revid = revmap.get(source.source.revid(m.group(2) or m.group(3)))
print 'converting commit log : %s -> [%s]' % (m.group(0), new_revid)
if new_revid is None:
return m.group(0)
return '[%s]' % new_revid[:12]
return rx_revision.sub(replacer, desc)
def putcommit(self, files, copies, parents, commit, source, revmap):
...
text = self._rewritedesc(commit.desc, source, revmap)
...
它似乎有效,但问题是转换过程不会扫描更改集的顺序。有许多转换结果丢失。
实际上,转换扩展提供了几个排序选项,包括“sourcesort”,它在提交顺序中处理变更集,但仅支持mercurial源。 “datesort”似乎比“branchsort”更好地工作,但不如我想要的那么好。
我调查了转换过程完成后是否可以修改提交日志(那时,我们有一个由扩展生成的完整修订ID映射),但这是不可能的 - 有已知的黑客使用mq和histedit扩展但是他们更改reivision ID。
有没有人试图这样做或帮助我?
答案 0 :(得分:1)
如何进行两步转换?首先将存储库从SVN转换为Mercurial。然后在新的Hg存储库上再次运行convert扩展以转换所有描述?您应该可以使用sourcesort
。