将Subversion仓库拆分为多个Mercurial仓库?

17

我们正在从Subversion迁移到Mercurial,并在SVN-> Hg转换过程中遇到了问题。目前,我们的单个SVN仓库保存了几个不同“项目”的代码,并且我们希望在迁移过程中将它们分开。我们的SVN仓库组织结构如下:

.
|-- proj1
|   |-- branches
|   |-- tags
|   `-- trunk
`-- proj2
    |-- branches
    |-- tags
    `-- trunk

我们想要将proj1proj2变成它们各自的Hg仓库。当然,我们希望不会出现特定于proj1的历史记录也出现在proj2的日志中。目前,当hg convert进行转换时,它只是相当愚蠢地读取所有文件,甚至无法区分分支和主干。

如何按目录过滤并识别hg convert中的SVN分支?


1
+1 这是一个非常重要的问题,在许多公司都很相关。 - Andres Jaan Tack
1
@erjiang:如果你之前在svn中使用一个仓库里面管理两个项目很愉快,为什么不尝试使用Mercurial遵循相同的(不正确)架构呢?;-))) - zerkms
4
在Subversion中,“All in one”设置非常好,因为它可以仅检出树的部分。Mercurial(和其他分布式版本控制系统)无法提供此功能,因此使用"convert" 和 "filemap" 可以很容易地拆分存储库。 - Ry4an Brase
1
这是类似的问题:https://dev59.com/aHA75IYBdhLWcg3w3NBe#3067054 - Ry4an Brase
1
对于所有没有帮助的评论者给予-1评分。 - Binary Phile
显示剩余4条评论
3个回答

8
我已经成功地使它工作了,这要归功于ConvertExtension维基页面!我尝试了Ry4an的方法,但它有缺点,必须先将SVN repo转换为中间Mercurial repo,然后再拆分一切,并且不能识别分支、主干和标签,因为有两个项目,每个项目都有自己的分支、主干和标签。我发现手动指定分支、主干和标签目录可很好地将一个项目从SVN转换为Mercurial:
hg \
--config convert.svn.trunk=proj1/trunk \
--config convert.svn.branches=proj1/branches \
--config convert.svn.tags=proj1/tags \
convert --authors authors.txt original-svn-dir hg-proj1

这将识别SVN分支、标签和主干,同时过滤仅为proj1版本。然后,我只需对proj2重复此操作。

很高兴你把它搞定了。多次进行svn->hg转换的缺点是,svn->hg部分所需时间比hg->hg部分长得多,因此考虑到获取authormaps、splits等正确性的迭代性质,只需进行一次svn->hg,然后为每个项目执行(并重新执行)hg->hg通常可以节省时间。此外,如果您将使用convert的增量转换支持(即:一个月后再次执行此操作,将新的svn内容引入而不更改hg哈希ID),则需要单个svn转换。 - Ry4an Brase
这是一个本地到本地的转换,所以时间上并不太糟糕。 - erjiang

2

0

这很容易使用您建议的“convert”扩展完成。以下是步骤:

  1. 使用hg convert SVNREPO all-in-one-mercurial-repo从svn转换到mercurial并包含所有内容
  2. 执行多个hg convert --filemap projectfilemap.txt all-in-one-mercurial-repo project-repo命令 - 每个项目一个命令

这些文件映射中包含如下行:

exclude proj1
rename proj2 .

这是从多合一的Mercurial repo中仅提取项目二存储库时使用的文件映射。您可能需要在这些映射中列出每个单独的文件,但我认为目录是可以的。

在SO上还有另一个问题,我在那里几乎回答了相同的问题,并粘贴了一个完整的示例,但那应该足够帮助您开始。


可以发一下之前问题的链接吗? - erjiang
哦,另外,hg convert 能否像 git-svn 一样理解分支? - erjiang
是的,如果您使用了普通的branches/、tags/、trunk/树形结构,它会很好地捕捉到它们。 - Ry4an Brase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接