我们目前使用subversion作为我们的版本控制系统,我们已经决定转向git。我一直很难将带有标准布局的subversion系统移动到git中。我尽可能多地使用git svn
。
我需要完成的是将我们的subversion系统转换为git,包含所有提交历史记录以及标记和分支。然后,为了能够将每个项目分成单独的git存储库及其各自的历史记录,然后将每个单独的存储库组合成子模块。
我很感激有关如何最轻松地完成此任务的任何想法。
svnroot/
|-- branches
|-- tags
|-- trunk
|-- project A
|-- project B
`-- project C
请,谢谢
答案 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>
跳过项目中的匹配路径。