SVN迁移到GitLab

举报
yd_221104950 发表于 2020/12/03 00:02:39 2020/12/03
【摘要】 要求保留SVN上的提交记录 1. 账号对应 svn的日志记录: r2 | lisi | 2014-12-12 15:11:59 +0800 (五, 12 12月 2014) | 1 line ssss 1234 git的日志记录: Author: zhangsan <zhangsan@qq.com> Date: Thu Jan 16 11:28:30 ...

要求保留SVN上的提交记录

1. 账号对应

  • svn的日志记录:
r2 | lisi | 2014-12-12 15:11:59 +0800 (五, 12 12月 2014) | 1 line

ssss


  
 
  • 1
  • 2
  • 3
  • 4
  • git的日志记录:
Author: zhangsan <zhangsan@qq.com>
Date:   Thu Jan 16 11:28:30 2020 +0800 初始化意见反馈模块

commit 938ef83245f699c5c016b98ce454cffba3ce8eff

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对比svn与git的日志记录,可以发现svn仅使用账号展示提交记录;而git不仅使用账号,还使用了邮箱进行确认。所以svn迁移到git,需要将二者进行对应转换。所以要先导出svn账号然后进行转换,转换格式:svn账号=GitLab账号 <邮箱>,这个格式是下一步git-svn要求的。将转换好的信息保存到一个文件中,每个账号占一行。因为日志信息是我们所关注的,所以我们只导出日志记录里的账号即可。使用下面这个命令可以快速完成账号提取、账号对应关系编写及保存操作:

svn log SVN项目的url -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2"="$2" <"$2"@example.com>"}' | sort -u > 账号对应关系文件

  
 
  • 1
  • svn log命令会导出svn项目的所有日志;

  • awk命令对日志信息里的账号信息进行提取及对应关系的编写;

  • awk的处理单位是一行,根据svn日志格式特点,每一行记录都是以r开头的,所以awk当遇到r开头的行时,就以“|”分割这一行的数据,得到的数据里的第2项就是账号名。sub方法则对获得的账号名进行去空格、$符号操作,最后将结果通过管道“|”输出给sort命令处理;

  • sort -u可以对awk的输出进行去重及排序,并最终将结果保存到账号对应关系文件中。

实例:

~/Desktop$ svn log http://10.69.10.15:8080/svn/ai_project | awk -F '|' '/^r/ { sub(" ","",$2); sub(" $","",$2); print $2"="$2" <"$2"@example.com>"}' | sort -u > svn2gitlab.txt

  
 
  • 1

在我们导出的账号对应关系的文件svn2gitlab.txt中,所有的账号对应的邮箱都统一成了账号@example.com,但是在gitlab中的不同账号可能使用了不同的邮箱,因此我们要这样处理:

  • 如果svn账号在gitlab中也有账号(即账号名是一样的),那么svn2gitlab.txt文件中相应的账号的邮箱就要修改成在gitlab中的邮箱
  • 如果svn账号在gitlab中没有对应账号,那么就不用修改,使用svn2gitlab.txt中默认的。

2.git-svn拉取SVN项目

使用git-svn拉取SVN项目。

  • 下载并安装git-svn,方式一:在http://fr2.rpmfind.net/linux/rpm2html/search.php搜索git-svn,然后根据自己的平台选择下载安装。方式二:使用源来安装,如ubuntu:sudo apt-get install git-svn

  • 执行命令:git svn clone "SVN项目url" --no-metadata --authors-file="账号对应关系文件" 自定义项目名,拉取项目,并使用账号对应关系文件将svn的提交记录转换为git提交记录

    正常的svn签出:

    ~/Desktop/H/ai_project$ ls -a
    .   app gradle   local.properties  key.sign proguard-project.txt  .svn
    ..  build.gradle  .gradle  main.iml pda_svn.iml  settings.gradle
    
    
        
       
    • 1
    • 2
    • 3
    • 4

    使用git svn拉取的:

    ~/Desktop/TestSVN2Git/ai_project$ ls -a
    .   app .git .gradle main.iml  pda_svn.iml settings.gradle
    ..  build.gradle  gradle  local.properties  key.sign  proguard-project.txt
    
        
       
    • 1
    • 2
    • 3

    从上面的对比可以看出git svn拉取的项目的.svn被转换成了.git,这其实就相当于将一个svn项目转换成git项目。

实例:

~/Desktop/TestSVN2Git$ git svn clone http://10.69.10.15:8080/svn/ai_project --no-metadata --authors-file=../svn2gitlab.txt ai_project

  
 
  • 1

3.提交项目到GitLab

这里所要做的工作,完成就是本地git仓库迁移到远程git仓库所要做的工作了。
切换到使用git-svn拉取的项目目录下,通过以下步骤完成提交:

  • 配置项目用户信息
 git config --local user.name "GitLab用户名"
 git config --local user.email "GitLab邮箱"

  
 
  • 1
  • 2

如:

~/Desktop/TestSVN2Git/ai_project$ git config --local user.name "Administrator"
~/Desktop/TestSVN2Git/ai_project$ git config --local user.email "admin@example.com"

  
 
  • 1
  • 2
  • 创建空仓库,可以在GitLab web页面创建或使用GitLab API创建,可参考《本地git仓库迁移到远程git仓库》文章。

    这一步将得到空仓库的git地址:http://10.69.10.13/android/aiproject.git。

  • 将本地仓库关联到新的远程仓库git remote add origin GitLab项目的git地址

    ~/Desktop/TestSVN2Git/ai_project$ git remote add origin http://10.69.10.13/android/aiproject.git
    
        
       
    • 1
  • 推送远程git push -u origin master

    ~/Desktop/TestSVN2Git/ai_project$ git push -u origin master
    
        
       
    • 1

后记:

svn迁移git,大致就是通过git svn在拉取项目时使用账号对应关系文件将svn的提交记录转换为git提交记录,然后推送到新项目中去。

扫二维码加关注:
在这里插入图片描述

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/105589263

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。