转载于:https://blog.csdn.net/u010039418/article/details/86138101/
背景
项目上使用的svn作为代码版本管理工具,由于资源整合,需要迁移到gitlab上,同时要保留历史提交记录。
迁移过程
1、获取svn提交用户名
因为在git上每个提交需要有用户的提交信息,如邮箱,因此我们得先获取到所有的用户名,然后生成如下对应的git格式,用于稍后的git clone上。
chenshiying = chenshiying <512889371@qq.com>
Kobe = Kobe <Kobe@timeloit.com>
在windows对应工程目录下打开cmd命令窗口,执行以下命令,
svn log > log.txt
执行后会在当前目录下生成所有历史提交记录,如下格式,
------------------------------------------------------------------------
r16223 | Kobe | 2017-08-18 15:22:04 +0800 (周五, 18 8月 2017) | 1 line
------------------------------------------------------------------------
r16222 | Kobe | 2017-08-18 15:21:49 +0800 (周五, 18 8月 2017) | 1 line
------------------------------------------------------------------------
r16221 | Jordan | 2017-08-18 15:09:03 +0800 (周五, 18 8月 2017) | 1 line
这时候可以把该文件放到linux环境下,提取并编辑为上述格式的用户对应文件。可通过如下命令提取所有用户,
grep "^r[0-9]" log.txt | awk -F "|" '{print $2}' | sort -n | uniq > users.txt
然后稍加修饰,生成用户映射文件,
while read line;do echo "$line = $line <$line@timeloit.com>" >> user;done < users.txt
2、准备环境
我们通过linux环境将svn代码迁移到git上,因此linux环境上要先安装git-svn组件,
yum install -y git-svn
3、拉取svn代码到本地
通过git svn clone命令将svn库代码拉取到本地,
git svn clone svn_address --no-metadata --authors-file=user local_dir --username=chenshiying
其中,
svn_address 即为待迁移svn的工程地址;
–no-metadata 防止git拉取无用的SVN附加信息;
–authors-file 指定用户映射文件,即第一步里生成的文件;
local_dir 为本地存放该svn工程目录,若不存在,git会自行创建;
–username 即为使用指定用户拉取代码,因此该用户必须要有拉取代码的权限。
执行命令后,输入密码,对应的svn工程就会被拉取到本地。
4、获取gitlab地址
确定svn工程迁入后存放位置,例如,
git@gitlab.net:groupname/projectname.git
最好现在gitlab上创建好projectname,设置好相关权限。虽然git push的时候会自动创建,但是设置都是默认的,可能不符合你要求。
5、添加远程git库
使用git remote命令添加远程服务器,也就是git代码存放路径。
git remote add origin git@gitlab.net:groupname/projectname.git
其中,origin为远程服务器名字,你也可以使用其他名字。
6、提交代码到git库
将本地的master分支推送到我们刚才关联的远程服务器origin,同时指定origin为默认主机,后续push就不需要指定远程服务器了。
git push -u origin master
这样在gitlab上就能看到工程代码,以及svn转换后的commit历史提交记录。
注意事项
1、git svn clone太慢
如果svn的提交记录太多,可以拉取最后几个版本即可,毕竟太旧的提交记录也没什么意义。使用以下命令拉取svn特定修改版本代码,
git svn clone -r31137:HEAD svn_address --no-metadata --authors-file=user local_dir --username=chenshiying
以上命令拉取第5000次修改到最新代码修改的记录,用户可以根据实际需要确定起始拉取的版本。
2、svn 提取的用户中有(no author)
由于各种原因,svn导出的日志中,提交人出现no author的情况,在git svn clone执行时总是报错。由于没有svn服务器权限,因此只能在users.txt的用户映射文件中添加以下映射,
(no author) = no author <no author@timeloit.com>
3、问题:
- 如果你的地址是
https
,那么在命令行中会提示证书验证问题,如何忽略验证呢?命令执行:git config --global http.sslVerify false
- 如果你执行过程失败,多次执行了
init
操作,它会提示错误
Using existing [svn-remote "svn"] svn-remote.svn.fetch already set to track
此时应该:
(1) 自己创建的目录下多了一个空白的文件夹,删掉它
(2) ~ 不太记得了,貌似1就行了
4、会有一个确认操作,我曾卡在这里很久,这里不是输入 Y/N
(R)eject, accept (t)emporarily or accept (p)ermanently? Y
暂时接受还是永久接受; 所以请回复 t/p
F:\9Git140\gitlabUser.txt