SVN迁移到Git
svn目录结构
先来看看svn目录结构,这个会关系到我们如何迁移。以下说的都是单个项目的迁移。
标准
/d/proj1
├── branches
│ ├── a
│ │ └── readme.txt
│ └── b
│ ├── 11.txt
│ └── readme.txt
├── tags
│ └── v1.0
│ ├── 11.txt
│ └── readme.txt
└── trunk
└── readme.txt
非标准
目前我们使用的结构
/d/proj1
├── branches
│ ├── a
│ │ └── readme.txt
│ └── b
│ ├── 11.txt
│ └── readme.txt
├── develop
└── trunk
└── readme.txt
git svn
svn迁移到git的核心命令。该命令包含在git中,需要先安装git。
使用示例
git svn clone svn://192.168.1.108:9999/migrator/ --no-metadata --authors-file=userinfo.txt --trunk=trunk --tags=tags --branches=branches migrator
从svn迁移到git的流程就是从svn拉取代码到本地,然后推送到git。当然我们肯定是希望能保留svn中的提交记录,这个完全没有问题。
签名映射
某些情况下,svn中的提交署名和要迁入的git系统署名不一致,这个时候可以指定名字映射,通过参数—authors-file指定。具体的文件格式可以Google下。
如果签名要保持一致,那么可以忽略这个文件
检出代码
先看看对于标准的svn目录结构的工程如何迁移。
对于标准svn目录结构的项目可以使用示例中命令,也可以使用以下简化的命令
git svn clone svn://192.168.1.108:9999/migrator/ -s
来说说示例中各参数的含义
- 参数–no-metadata表示阻止git导出SVN包含的一些无用信息
- 参数–authors-file表示SVN账号映射到git账号文件,所有svn作者都要做映射
- 参数–trunk表示主开发项目,一般就是trunk
- 参数–branches表示分支项目,
--ignore-refs
表示不包含后面的分支项目 - 参数migrator表示git项目名称
再来看看非标准svn目录结构的项目如何处理(以我们现在的目录为例)
git svn clone svn://192.168.1.108:9999/migrator/ --no-metadata --trunk=trunk --tags=tags --branches=branches migrator
先检出不包含develop的代码
接着往下
推送代码到git
使用git命令将各个分支推送到git远端(切换到各个分支并push,不会的自己查询方法)
到此,标准svn目录的工程就迁移到了git上。非标准svn目录的项目继续往下
处理非标准svn目录项目
删除本地检出的代码,重新检出不在svn标准目录中的分支(develop)
git svn clone http://svn.***.com/svn/***/develop/ migrator
将develop推送到远端
git push git@git.***.com:***/migrator.git develop:develop
至此,单个项目迁移完毕。而且新的git项目中保留了所有svn的提交记录。