2010-12-21 81 views
2

我们目前使用subversion作为我们的版本控制系统,我们已决定转移到git。我一直很难将标准版本的Subversion系统移动到git中。我尽可能多地使用了git svn使用子模块从SVN转换为Git

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

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

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

请和谢谢

+0

你的SVN结构是什么? – mipadi 2010-12-21 18:59:55

+0

我已经更新了我的答案svn结构http://stackoverflow.com/questions/4502847/converting-from-svn-to-git-with-submodules/4504410#4504410 – jfs 2010-12-23 20:15:09

回答

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)并将创建的git仓库添加为子模块project{A,B,C}git submodule)。

但是它可能不是你想要的;从git submodule手册:

子模块允许外国库 要被嵌入专用 子目录源树的内, 总是指向一个特定的提交。

他们不要与遥控器混淆,这意味着主要是为同一项目的分支机构 ;子模块的意思是不同的 项目,你想成为你的源代码树的一部分,而 两个项目的历史仍然保持完全独立,你不能 从主项目中修改子模块的内容。

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


对于所提供的svn的布局:

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

尝试创建git仓库使用--trunk--branches--tags参数如:

$ 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>跳过项目中的匹配路径。