【问题标题】:Converting subversion repository to mercurial converting revision IDs in commit logs将 subversion 存储库转换为提交日志中的 mercurial 转换修订 ID
【发布时间】:2011-01-14 05:53:57
【问题描述】:

我正在将一个大型(大约有 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)
    ...

这似乎可行,但问题是转换过程不会扫描更改集的提交顺序。缺少很多转化结果。

实际上,convert 扩展提供了几个排序选项,包括“sourcesort”,它按提交顺序处理变更集,但它仅支持 mercurial 源。 “datesort”在这种方式下似乎比“branchsort”工作得更好,但没有我想要的那么好。

我调查了我是否可以在转换过程完成后修改提交日志(当时,我们有一个由扩展生成的完整修订 ID 映射),但这是不可能的——有使用 mq 和 histedit 扩展的已知黑客,但他们更改修订 ID。

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

【问题讨论】:

  • 重新排序是否只发生在您的补丁中?大约 2 年前,我进行了类似的转换,并且没有遇到此类麻烦。

标签: svn version-control mercurial dvcs


【解决方案1】:

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

【讨论】:

  • 哦,这是个好主意。但是我没有足够的时间等待您的回复,所以无论如何已经使用了如上转换的存储库。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多