在提交日志中将subversion存储库转换为mercurial转换修订ID

时间:2011-01-14 05:53:58

标签: svn version-control mercurial dvcs

我正在将一个大的(大约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。

有没有人试图这样做或帮助我?

1 个答案:

答案 0 :(得分:1)

如何进行两步转换?首先将存储库从SVN转换为Mercurial。然后在新的Hg存储库上再次运行convert扩展以转换所有描述?您应该可以使用sourcesort