【发布时间】: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