将特定文件夹从 SVN 迁移到 Git

Posted

技术标签:

【中文标题】将特定文件夹从 SVN 迁移到 Git【英文标题】:Migrating specific folders from SVN to Git 【发布时间】:2017-08-02 12:08:14 【问题描述】:

我有一个如下所示的 SVN 存储库:

后备箱: dir_1 dir_2 dir_3 dir_4 dir_5 dir_6

并且我希望仅将目录 dir_1、dir_2 和 dir_5 迁移到新的 Git 存储库,包括所有分支以及这些目录的历史记录。 所以结果将是:

主人:

dir_1 dir_2 dir_5

这可能吗?

【问题讨论】:

分支机构在哪里? 这是一次性迁移,之后您只使用 Git,还是想从 Git 克隆提交回 SVN? 这是一次性迁移,目的是仅在迁移后使用 Git。 【参考方案1】:

git-svn不是一次性转换存储库或存储库部分的正确工具。如果您想使用 Git 作为现有 SVN 服务器的前端,这是一个很棒的工具,但对于一次性转换,您应该使用git-svn,而是使用更适合的svn2git这个用例。

有很多工具叫做svn2git,可能最好的一个是来自https://github.com/svn-all-fast-export/svn2git 的KDE 工具。我强烈推荐使用svn2git 工具。它是我所知道的最好的,它在你可以用它的规则文件做什么方面非常灵活。

您将能够轻松配置svn2gits 规则文件以产生您想要的结果。

如果您不是 100% 了解存储库的历史记录,那么在将 SVN 存储库迁移到 Git 时,http://blog.hartwork.org/?p=763 中的 svneverever 是一个很好的工具来调查它的历史记录。


尽管git-svn 更容易开始,这里还有一些其他原因说明为什么使用 KDE svn2git 而不是 git-svn 除了灵活性之外更胜一筹:

svn2git(如果使用正确的)重建历史记录会更好更干净,尤其是对于具有分支和合并等的更复杂的历史记录而言 标签是真正的标签,而不是 Git 中的分支 git-svn 标签包含一个额外的空提交,这也使它们不属于分支,因此在您将--tags 提供给命令之前,普通的fetch 不会得到它们,因为默认情况下只有标签指向提取的分支也被提取。使用正确的 svn2git 标签是它们所属的地方 如果您在 SVN 中更改了布局,您可以使用 svn2git 轻松配置它,使用 git-svn 您最终会丢失历史记录 使用svn2git,您还可以轻松地将一个 SVN 存储库拆分为多个 Git 存储库 或将同一 SVN 根目录中的多个 SVN 存储库轻松合并到一个 Git 存储库中 正确的svn2git 的转换速度比git-svn 快无数倍

您知道,git-svn 更差,而 KDE svn2git 更优的原因有很多。 :-)

【讨论】:

【参考方案2】:

您可以将 git-svn 与 --include-paths 选项一起使用:

git svn clone <svn url> --trunk=Trunk --include-paths="dir_1\/|dir_2\/|dir_5\/" --no-metadata

--include-paths 的输入是正则表达式,因此请确保它与存储库中的其他文件夹不匹配。仅当您不再提交到 svn 存储库时才使用 --no-metadata 标志。

【讨论】:

以上是关于将特定文件夹从 SVN 迁移到 Git的主要内容,如果未能解决你的问题,请参考以下文章

使用Tortoise Git进行SVN to GIT迁移

从svn迁移到git

SVN到GIT迁移作者的列表

从 SVN 迁移到 Git 存储库,其中同一项目的一部分已经发生迁移

迁移到 GIT 后测试应用程序

centos上 svn迁移到gitlab