svn迁移到gitlab并保留commit历史记录

转载于: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、问题:

  1. 如果你的地址是https,那么在命令行中会提示证书验证问题,如何忽略验证呢?命令执行:git config --global http.sslVerify false
  2. 如果你执行过程失败,多次执行了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值