将SVN子目录转换为Git

mag*_*ter 25 svn git git-svn

我想抛弃SVN for Git.我现在的SVN仓库设置有下躯干(项目/trunk/projecta,/trunk/projectb等有标签,并在树枝/tags/projecta-1.0等).我想通过使用git-svn将它们从SVN中拉出来为每个项目创建不同的Git存储库.

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

Mar*_*tos 18

这很棘手.为了获得例如项目的标签,其所有标签必须位于公共目录下,但是您的结构具有共享单个标签目录的所有项目.

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

git-svn init --trunk=trunk/projecta --tags=tags/projecta ...
Run Code Online (Sandbox Code Playgroud)

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


sta*_*ker 5

我最近不得不用一个相当复杂的案例来解决这个问题(从 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 存储库数据集的完整副本。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 ..
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在 svn 提交者和 git 提交者之间创建身份映射

    文件:帐户地图

    svnname1 Jane Coder <coder@foo.org>
    svnname2 Joe Techwriter <writer@foo.org>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建 svn2git 过滤规则来捕获 utahrle 历史记录。我将在这里发布完整的 utahrle 示例,该示例展示了如何跟踪不同目录之间的历史记录,但我希望大多数情况不会那么糟糕:

    文件:规则

    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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 运行 svn-all-fast-export 生成存档(svn_repo 是保存 subversion 文件完整副本的目录):

    svn-all-fast-export --identity-map 帐户映射 --rules 规则 svn_repo

  6. 使用上述规则文件,utahrle 保存生成的 git 存储库。使用 gitk 检查我们期望看到的历史记录是否确实存在,然后(如果您使用此存储库作为在线源存档)使用标准 sourceforge 程序上传现有的 git 存储库。