使用子模块从SVN转换为Git

使用子模块从SVN转换为Git,svn,git,git-submodules,Svn,Git,Git Submodules,我们目前使用subversion作为版本控制系统,我们决定转向git。我一直很难将我的标准布局subversion系统迁移到git中。我已经尽可能多地使用了git svn 我需要完成的是将我们的subversion系统转换为git,其中包含所有提交历史以及标记和分支。然后,为了能够将每个项目与各自的历史记录分离成单独的git存储库,然后将这些单独的存储库组合成子模块 如果您有任何关于如何最轻松地完成此任务的想法,我将不胜感激 svnroot/ |-- branches |-- tags |--

我们目前使用subversion作为版本控制系统,我们决定转向git。我一直很难将我的标准布局subversion系统迁移到git中。我已经尽可能多地使用了git svn

我需要完成的是将我们的subversion系统转换为git,其中包含所有提交历史以及标记和分支。然后,为了能够将每个项目与各自的历史记录分离成单独的git存储库,然后将这些单独的存储库组合成子模块

如果您有任何关于如何最轻松地完成此任务的想法,我将不胜感激

svnroot/
|-- branches
|-- tags
|-- trunk
    |-- project A
    |-- project B
    `-- project C

如果您的svn存储库布局为:

svnroot/
|-- projectA
|   |-- branches
|   |-- tags
|   `-- trunk
|-- projectB
|   |-- branches
|   |-- tags
|   `-- trunk
`-- projectC
    |-- branches
    |-- tags
    `-- trunk
然后,您可以为每个项目创建单独的git存储库,例如,
projectA

$ git svn clone --stdlayout https://svn.example.net/svnroot/projectA
之后,您可以创建主git repo(),并将为
项目{A,B,C}
创建的git repo作为子模块添加到它()

但这可能不是你想要的;从
git子模块
手册:

子模块允许外部存储库 嵌入到专用的 源树的子目录, 始终指向特定的提交

不要将它们与遥控器混淆,遥控器主要是指 同一项目的分支机构;子模块用于不同的应用程序 您希望成为源代码树一部分的项目,而 这两个项目仍然保持完全独立,您无法 从主项目中修改子模块的内容

如果您想在主项目中修改
项目{A,B,C}
,并保留项目的联合历史记录,则子模块不适合该任务


对于提供的svn回购布局:

svnroot/
|-- branches
|-- tags
|-- trunk
    |-- projectA
    |-- projectB
    `-- projectC
尝试使用
--trunk
--branchs
--tags
参数创建git存储库,例如:

$ git svn clone                       \
>    --trunk trunk/projectA           \
>    --branches branches              \
>    --tags  tags                     \
>    https://svn.example.net/svnroot  \
>    projectA
完成后,
.git/config
文件应包含以下内容:

[svn-remote "svn"]
        url = https://svn.example.net/svnroot
        fetch = projectA/trunk:refs/remotes/trunk
        branches = branches/*:refs/remotes/*
        tags = tags/*:refs/remotes/tags/*

您可以使用跳过项目中的匹配路径。

我已经更新了svn结构的答案