如果你的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>
跳过项目中的匹配路径。
来源
2010-12-21 22:06:51
jfs
你的SVN结构是什么? – mipadi 2010-12-21 18:59:55
我已经更新了我的答案svn结构http://stackoverflow.com/questions/4502847/converting-from-svn-to-git-with-submodules/4504410#4504410 – jfs 2010-12-23 20:15:09