将SVN子目录转换为Git

时间:2010-05-02 01:32:26

标签: svn git git-svn

我想抛弃SVN for Git。我当前的SVN存储库设置包含在主干(/trunk/projecta/trunk/projectb等下的项目,其中包含/tags/projecta-1.0处的标记和分支等。我想使用git-svn将它们从SVN中拉出来,为每个项目创建不同的Git存储库。

我已成功将整个SVN仓库撤回到本地Git仓库,但现在所有项目都存在于同一个Git仓库中。此时是否有可能将它们拆开?

4 个答案:

答案 0 :(得分:18)

这很棘手。为了得到例如项目的标签,它的所有标签都必须在一个公共目录下,但是你的结构让所有项目都共享一个标签目录。

也许您可以将/tags/projecta-1.0移动到/tags/projecta/1.0等等,然后一次将项目导入到git中:

git-svn init --trunk=trunk/projecta --tags=tags/projecta ...

我不知道这是否会按预期工作,所以 在您的存储库副本上执行此操作,而不是原始文件!

答案 1 :(得分:4)

我最近不得不用一个相当复杂的案例解决这个问题(从BRL-CAD的整体历史中提取utahrle文件来制作一个单独的GIT项目)并最终使用带有规则文件的svn2git。这些是我的步骤 - 不确定它是否是“正确的”方式,但它似乎在我的案例中取得了成功:

  1. 确保安装了svn2git,以及subversion和git (如果尚未存在,则启用git subversion支持。)注意 似乎有多个程序使用项目名称 svn2git - 我用过的就是这个:

    http://www.gitorious.org/svn2git

    KDE的这篇文章让我开始:

    http://techbase.kde.org/Projects/MoveToGit/UsingSvn2Git

  2. 获取svn存储库的本地副本。请注意这一点 不是存储库的签出,而是完整副本 整个SVN repo数据集。 Sourceforge使这成为可能 使用rsync选项 - 有关详细信息,请参阅其文档:http://sourceforge.net/p/forge/documentation/rsync%20Backups/。我不是 确定其他网站。

    mkdir svn_repo
    cd svn_repo
    rsync -av svn.code.sf.net::p/PROJECTNAME/MOUNTPOINT .
    cd ..
    
  3. 在svn提交者和git提交者之间创建身份映射

    file:account-map

    svnname1 Jane Coder <coder@foo.org>
    svnname2 Joe Techwriter <writer@foo.org>
    
  4. 创建svn2git过滤规则以捕获utahrle历史记录。 我将在这里发布完整的utahrle示例,说明如何 按照不同目录之间的历史记录,但是 我希望大多数情况都不会那么糟糕:

    file:rules

    create repository utahrle
    end repository
    
    match /brlcad/trunk/libutahrle/
       min revision 1
       max revision 22796
       repository utahrle
       branch master
    end match
    
    match /brlcad/trunk/tools/
       min revision 1
       max revision 22814
       repository utahrle
       branch master
    end match
    
    match /brlcad/trunk/src/other/libutahrle/
       min revision 22797
       repository utahrle
       branch master
    end match
    
    match /brlcad/trunk/src/other/URToolkit/
       min revision 22815
       repository utahrle
       branch master
    end match
    
    match /
    end match
    
  5. 运行svn-all-fast-export生成存档(svn_repo是保存目录 您的subversion文件的完整副本):

    svn-all-fast-export --identity-map account-map --rules rules svn_repo

  6. 使用上面的规则文件,utahrle保存了生成的git 库。使用gitk检查我们希望看到的历史记录 实际存在,然后(如果你使用这个回购作为在线 源档案)使用标准的sourceforge程序 用于上传现有的git存储库。

答案 2 :(得分:1)

当存储库布局非常复杂时,有一个名为svn2git的工具可以使用规则集转换复杂的存储库。

您可以在此处下载:http://gitorious.org/svn2git/ 该程序需要编译,需要Qt,Apache和SVN头文件。

答案 3 :(得分:1)

Subversion存储库的一次性转换的另一个程序是Svn2Git(与vdboor的答案不同),它依赖性较少,并且对我的存储库做得很好。