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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010039418/article/details/86138101

背景

项目上使用的svn作为代码版本管理工具,由于资源整合,需要迁移到gitlab上,同时要保留历史提交记录。

迁移过程

1、获取svn提交用户名

因为在git上每个提交需要有用户的提交信息,如邮箱,因此我们得先获取到所有的用户名,然后生成如下对应的git格式,用于稍后的git clone上。

Jordan = Jordan <[email protected]>
Kobe = Kobe <[email protected]>

在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 <[email protected]>" >> 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=users.txt local_dir --username=Kobe

其中,
svn_address 即为待迁移svn的工程地址;
–no-metadata 防止git拉取无用的SVN附加信息;
–authors-file 指定用户映射文件,即第一步里生成的文件;
local_dir 为本地存放该svn工程目录,若不存在,git会自行创建;
–username 即为使用指定用户拉取代码,因此该用户必须要有拉取代码的权限。

执行命令后,输入密码,对应的svn工程就会被拉取到本地。

4、获取gitlab地址

确定svn工程迁入后存放位置,例如,

[email protected]:groupname/projectname.git

最好现在gitlab上创建好projectname,设置好相关权限。虽然git push的时候会自动创建,但是设置都是默认的,可能不符合你要求。

5、添加远程git库

使用git remote命令添加远程服务器,也就是git代码存放路径。

git remote add origin [email protected]: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 -r5000:HEAD svn_address --no-metadata --authors-file=users.txt local_dir --username=Kobe

以上命令拉取第5000次修改到最新代码修改的记录,用户可以根据实际需要确定起始拉取的版本。

2、svn 提取的用户中有(no author)

由于各种原因,svn导出的日志中,提交人出现no author的情况,在git svn clone执行时总是报错。由于没有svn服务器权限,因此只能在users.txt的用户映射文件中添加以下映射,

(no author) = no author <no [email protected]>

猜你喜欢

转载自blog.csdn.net/u010039418/article/details/86138101