使用子模块从SVN转换为Git

时间:2010-12-21 18:54:50

标签: svn git git-submodules

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

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

我很感激有关如何最轻松地完成此任务的任何想法。

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

请,谢谢

1 个答案:

答案 0 :(得分:2)

如果你的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仓库(git init)并将创建的project{A,B,C} git仓库作为子模块添加到其中(git submodule)。

可能不是你想要的;来自git submodule手册:

  

子模块允许外部存储库   嵌入专用的   源树的子目录,   总是指着一个特定的提交。

     

它们不应与遥控器混淆,遥控器主要是指   对于同一项目的分支机构;子模块适用于不同的   您想要成为源代码树的一部分的项目,而历史   这两个项目仍然完全独立,你不能   从主项目中修改子模块的内容。

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


对于提供的svn repo布局:

svnroot/
|-- branches
|-- tags
|-- trunk
    |-- projectA
    |-- projectB
    `-- projectC

尝试使用--trunk--branches--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/*

您可以使用--ignore-paths=<regex>跳过项目中的匹配路径。