将 SVN 子目录转换为 Git

Posted

技术标签:

【中文标题】将 SVN 子目录转换为 Git【英文标题】:Convert SVN Subdirectory to Git 【发布时间】:2010-05-02 01:32:25 【问题描述】:

我想为 Git 放弃 SVN。我当前的 SVN 存储库设置在主干下有项目(/trunk/projecta/trunk/projectb 等,标签和分支在/tags/projecta-1.0 等)。我想通过使用 git-svn 将它们从 SVN 中拉出,为每个项目创建不同的 Git 存储库。

我已成功将整个 SVN 存储库提取到本地 Git 存储库,但所有项目现在都存在于同一个 Git 存储库中。此时是否可以将它们分开?

【问题讨论】:

我听说有比 git-svn 更好的将 Subversion 转换为 Git 的长期选项(因为 git-svn 专门用于能够提交),但是我没有任何关于手的参考资料。 【参考方案1】:

这很棘手。例如,要获取一个项目的标签,它的所有标签都必须位于一个公共目录下,但您的结构中的所有项目都共享一个标签目录。

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

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

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

【讨论】:

我不太关心标签/分支,所以这很有效。我在我的 Ubuntu Lynx 机器上执行了这个:"""git svn clone --no-metadata --trunk=trunk/projecta svn/repoprojecta""" 挺诡计的,最简单的方法是新建两个git项目,将ProjectA和ProjectB对应复制到git repo,但是这样会丢失所有历史:(【参考方案2】:

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

    确保已安装 svn2git,以及 subversion 和 git (启用 git subversion 支持,如果不存在的话。)注意 似乎有多个程序使用项目名称 svn2git - 我用的是这个:

    http://www.gitorious.org/svn2git

    这篇来自 KDE 的文章让我开始了:

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

    获取 svn 存储库的本地副本。请注意,这 不是存储库的 checkout,而是 整个 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 ..
    

    在 svn 提交者和 git 提交者之间创建身份映射

    文件:账户地图

    svnname1 Jane Coder <coder@foo.org>
    svnname2 Joe Techwriter <writer@foo.org>
    

    创建 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
    

    运行 svn-all-fast-export 生成存档(svn_repo 是存放目录 您的颠覆文件的完整副本):

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

你可以在这里下载:http://gitorious.org/svn2git/ 程序需要编译,需要Qt、Apache和SVN头文件。

【讨论】:

以上是关于将 SVN 子目录转换为 Git的主要内容,如果未能解决你的问题,请参考以下文章

如何在将一个巨大的存储库拆分为单独的存储库时将 SVN 转换为 GIT?

SVN迁移到gitlab的步骤和问题

为啥 `git svn clone` 不能转换所有的 SVN 分支?

如何将SVN仓库转换为Git仓库

使用 reposurgeon 将 svn repo 转换为 git

将git工作目录的改动应用到svn