SVN迁移到GitLab

要求保留SVN上的提交记录

1. 账号对应

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

ssss

  • git的日志记录:
Author: zhangsan <[email protected]>
Date:   Thu Jan 16 11:28:30 2020 +0800

    初始化意见反馈模块

commit 938ef83245f699c5c016b98ce454cffba3ce8eff

对比svn与git的日志记录,可以发现svn仅使用账号展示提交记录,而git不仅使用账号,还使用了邮箱进行确认。所以svn迁移到git,需要将二者进行对应转换。

做法就是导出svn账号,再将svn账号转换成等号左边为svn账号,等号右边为GitLab账号和邮箱信息,形如zhangsan=zhangsan <[email protected]>这样的信息,并记录到一个文件中,每个账号信息在文件中占一行。因为我们只关注日志信息,所以我们只导出有日志记录里的账号,并对这些账号操作即可。下面这个命令来完成账号对应关系的导出:

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

下面我们将账号对应关系导出到文件svn2git.txt中:

~/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

命令解释:

  • http://10.69.10.15:8080/svn/ai_project:导出svn日志
  • 导出的日志会通过管道’|'传给awk命令处理
  • awk的处理单位是一行,所以awk对每行数据进行以“|”分割,得到的结果的第2个项就是账号名。sub对账号名进行去空格、$符号,最后输出账号,账号通过管道"|"传给sort命令进行去重排序,最后将结果保存到文件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
    
    

    使用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
    

    从上面的对比可以看出.svn被转换成了.git

实例:

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

3.提交项目到GitLab

切换到使用Git-svn拉取的项目目录下:

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

如:

~/Desktop/TestSVN2Git/ai_project$ git config --local user.name "Administrator"
~/Desktop/TestSVN2Git/ai_project$ git config --local user.email "[email protected]"
  • 在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
    
  • 推送远程git push -u origin master

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

到了第三步这里,完成就是本地git仓库迁移到远程git仓库的问题。

后记:

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

发布了381 篇原创文章 · 获赞 85 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_40763897/article/details/105589263