具有复杂结构的Git-SVN克隆

具有复杂结构的Git-SVN克隆,git,svn,git-svn,Git,Svn,Git Svn,我需要将SVN存储库克隆到git。SVN存储库的结构类似于存储库的存储库,如下所示: SVNRepo |____ProjectA | |___branches | |___tags | |___trunk | file |____ProjectB | |___branches | |___tags | |___trunk file 我需要克隆存储库,这样我就可以得到一个git存储库,而不需要svn特定的文件夹(

我需要将SVN存储库克隆到git。SVN存储库的结构类似于存储库的存储库,如下所示:

SVNRepo
|____ProjectA
|    |___branches
|    |___tags
|    |___trunk
|            file
|____ProjectB
|    |___branches
|    |___tags
|    |___trunk
             file
我需要克隆存储库,这样我就可以得到一个git存储库,而不需要svn特定的文件夹(分支、标记、主干)。我最初转储了SVN repo,然后为每个项目将其拆分为单独的repo,并使用git SVN clone和--stdlayout命令迁移到git。这是可行的,但它本身的问题已经被我们的团队否决了

我用--stdlayout命令尝试了git svn clone,但没有成功。我最终得到了一个空的git repo,有两个提交(数百个提交中的两个),没有实际的文件。没有错误,所以我不确定发生了什么

在没有--stdlayout的情况下尝试git svn clone,我得到了一个包含所有文件和历史的git repo。但是,我仍然有我想删除的所有分支、标记和主干文件夹


我曾考虑过放弃SVN回购协议,并使用sed编辑二进制文件,但这似乎需要做很多工作。我想其他人也遇到了这个问题,解决了这个问题,但找不到任何有效的方法。

您可以在git svn的配置中设置多个中继、分支和标记位置。如果它们是从同一个父级创建的,git svn会找到答案

对于一次性迁移
git svn
不是转换存储库或存储库部件的正确工具。如果您想将Git用作现有SVN服务器的前端,那么它是一个很好的工具,但是对于一次性转换,您应该不要使用
Git SVN
,而是
svn2git
,它更适合此用例

有很多工具称为
svn2git
,最好的工具可能是来自的KDE工具。我强烈建议使用
svn2git
工具。这是我所知道的最好的一款,它的规则文件非常灵活

您将能够轻松地配置
svn2git
s规则文件,以从当前的SVN布局生成所需的结果

如果您不是100%了解存储库的历史记录,
svneverever
from是在将SVN存储库迁移到Git时调查其历史记录的一个很好的工具


尽管
git svn
更容易开始,但以下是使用KDE
svn2git
而不是
git svn
更优越的原因,除了它的灵活性之外:

  • 通过
    svn2git
    (如果使用了正确的历史记录),可以更好、更清晰地重建历史记录,对于具有分支和合并等更复杂的历史记录尤其如此
  • 这些标记是真实的标记,而不是Git中的分支
  • 使用
    git svn
    时,标记包含一个额外的空提交,这也使得它们不是分支的一部分,因此正常的
    fetch
    将不会获取它们,直到您将
    --tags
    交给命令,因为默认情况下,也只获取指向已获取分支的标记。使用正确的svn2git标记就可以找到它们所属的位置
  • 如果您更改了SVN中的布局,您可以使用
    svn2git
    轻松配置它,使用
    git SVN
    您最终将丢失历史记录
  • 使用
    svn2git
    还可以轻松地将一个SVN存储库拆分为多个Git存储库
  • 或者将同一SVN根目录中的多个SVN存储库轻松组合到一个Git存储库中
  • 使用正确的
    svn2git
    比使用
    git svn

你看,有很多原因导致
git svn
更差,而KDE
svn2git
更优越。:-)

您是指“您可以指定多个--tags和/或--branchs选项”吗?如果是这样,您能提供一个基本示例吗?如果您想知道如何在
git svn init
调用中指定它们,那么可以向存储库提供“基本”url,然后为单独的分支(使用--trunk)、分组的分支(使用--branchs)和标记提供多个位置。因此,在您的例子中,它应该类似于:git svn init-T ProjectA/trunk-B ProjectA/branchs-T ProjectA/tags-T ProjectB/trunk-B ProjectB/branchs-T ProjectB/tags。但现在我想知道。。。他们是同一个项目吗?因为如果他们不是,那么你应该考虑为每个项目创建一个单独的回购。谢谢。我会试试,然后再发回来。实际的SVN存储库中有13个项目。他们中的许多人相互依赖,但不是全部。我最初将它们分离出来,并将它们用作git子模块,但我遇到的问题是projA将依赖于projB和projC,而projB也将依赖于projC。我想你可以把它们分开,用gradle或maven之类的东西把它们绑在一起(如果使用Java,无论如何……我相信其他语言也有其他东西可用)。不管怎样,我只是在详细说明。我最初的建议是使用包管理器,但还是被否决了(