将Subversion存储库拆分为多个Mercurial存储库?

时间:2010-11-17 23:39:30

标签: svn mercurial hg-convert

我们正在从Subversion迁移到Mercurial,并且在SVN-> Hg转换过程中遇到了麻烦。现在,我们的单个SVN仓库为几个不同的“项目”保留代码,我们希望在迁移过程中将它们分开。我们的SVN回购组织为:

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

我们想简单地让proj1proj2成为他们自己的Hg回购。当然,我们还希望proj1的{​​{1}}日志中没有特定的历史记录。现在,当proj2执行转换时,它只是非常愚蠢地读取所有文件,甚至不区分分支与中继。

按目录过滤和识别hg convert中的SVN分支的过程是什么?

3 个答案:

答案 0 :(得分:8)

感谢ConvertExtension wiki page

,我现在已经开始工作了

我尝试了Ry4an的方法,但它带来的缺点是必须首先将SVN repo转换为中间Mercurial仓库,然后才能拆分所有内容,而且分支,主干和标签都没有被识别,因为每个都有两个项目有自己的分支,主干和标签。

我发现手动指定branches,trunk和tags目录非常适合一次将一个项目从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

这将同时识别仅proj1修订版的SVN分支,标记和主干过滤器。然后,我只是为proj2重复了一遍。

答案 1 :(得分:2)

另一种解决方法是使用svnadmin dump和svndumpfilter将svn repo拆分为每个项目的一个新的svn存储库,如svn文档中所述。 Splitting repositories by filtering repository history

答案 2 :(得分:0)

如您所建议的那样,使用'convert'扩展程序可以轻松完成此操作。这是程序:

  1. 从svn做一个hg convert SVNREPO all-in-one-mercurial-repo与所有事情一起做好事
  2. 执行多个hg convert --filemap projectfilemap.txt all-in-one-mercurial-repo project-repo命令 - 每个项目一个
  3. 这些文件地图中包含以下行:

    exclude proj1
    rename proj2 .
    

    这就是从一体化mercurial repo中提取项目二的repo时使用的文件映射。您可能需要在这些地图中列出每个单独的文件,但我认为目录没问题。

    这里还有另外一个问题,在那里我回答了几乎相同的事情并粘贴在一个完整的例子中,但这应该足以让你前进。