svn仓库分模块迁移到git仓库

编写目的

公司要求将现有svn服务器上的项目全部迁徙到gitlab服务器上由运维部门统一管理。刚开始也是网上找资料,网上关于这方面文章非常多,找了几篇比较写的详细文章按照步骤一步一步做,最后都没有成功,主要原因网上文章都是很早之前写的,有些命令在新版git上面运行出错,另外我们的项目很大,里面包含很多个子模块,由不同开发部门人员开发和维护,以前svn只需要开放对应目录给相关部门开发人员即可,现在如果不拆分出来就要把整个项目权限放开,非常不安全。经过自己大量摸索,找到一条行之有效的方法,现记录下来提供给需要的人参考下。

本文包括项目整体迁徙和按模块迁徙两个部分,如果不需要按模块迁徙后面部分可以忽略。

第一部分 项目从svn迁徙到git仓库

  1. 获取svn仓库代码提交者信息
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
  1. 修改提交者邮箱地址
    打开authors-transform.txt文件,修改括号里面内容为邮箱地址,如:
    修改前:VisualSVN Server = VisualSVN Server <VisualSVN Server>
    修改后:VisualSVN Server = VisualSVN Server <[email protected]>

  2. 获取SVN仓库文件过滤配置信息

git svn show-ignore --id=origin/trunk > .gitignore
  1. 用git命令克隆svn项目(可能需要安装git-svn)
git svn clone https://192.168.1.252/svn/project-repo/ --no-metadata --trunk=trunk --tags=tags --branches=branches --A authors-transform.txt --no-minimize-url [-r72:HEAD]
#参数–no-metadata表示阻止git导出SVN包含的一些无用信息
#参数–authors-file表示SVN账号映射到git账号文件,所有svn作者都要做映射(这里使用-A 指定)
#参数–trunk表示主开发项目
#参数–branches表示分支项目
#参数-r表示版本  例如上述-r72:HEAD表示从之前svn项目的版本72以后的开始同步,包括内容和commit日志,如果要所有的svn记录都同步则改为-r2:HEAD(不过此时会比较耗时,因此建议按需设置)
  1. 创建本地分支,不要带–track(下面命令执行出错的话可能是跟踪的远程分支名字不对,git克隆的svn仓库跟踪别名和git远程仓库不一样,可以试试直接用commit id或者tortoise工具创建)
git show-ref
git  checkout -b br1 origin/br1
git  checkout -b br2 origin/br2

第六步 向本地git仓库对应分支分别添加.gitignore和readme文件。如果不需要拆分子模块分别推送到不同git仓库,到这一步就可以本地仓库基本好了,后面就是远程创建一个空仓库,本地仓库push到远程的空仓库即可。

git add .
git commit -m "add git config file." .
git remote add github-repo-name [email protected]/github-repo-name
git push -u github-repo-name --all 

第二部分 svn分模块转存到git仓库

该部分内容包括创建子模块仓库和git项目跟踪到创建子模块仓库两块。

从svn子目录创建git子模块仓库的两种方式

两种方式相同点是一次只能创建一个分支的子模块,项目有多少个分支需要重复做多少次。创建好子模块分支后,按分支一个一个推送到远程git子模块仓库。

第一种方式

重新到svn仓库克隆子模块目录代码到本地,方法和上面克隆仓库一样,只需要把svn地址指向具体分支的子模块,这种方式一次只能拉取一个分支的子模块。推荐这种方式,步骤简单不容易出错。

第二种方式

在同步好的本地git仓库创建分支提取出子模块代码,创建好的子模块分支只对应整个项目的单个分支,项目存在多个分支需要到每个分支上创建子模块分支提取子模块代码。这种方式也有两种操作方法对应

  1. 方法一适用于svn提交代码都是分模块提交,如果一次提交多个模块,这样导出来的子模块携带有其他子模块代码,还有单独去删除。
cd REPOSITORY-NAME
git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME  BRANCH-NAME 
  1. 方法二简单些,创建的子模块分支干净,提交信息不包含其他模块跟踪文件
cd lib-repo
git subtree split --prefix=lib -b split
git push ~/lib-repo split:master

git项目跟踪到子模块仓库

  1. git子模块仓库创建好之后,把克隆好的git本地仓库对应分支下面的子模块目录删除,然后添加子模块引用。这里假设上面子模块路径为“src/submodule_folder”,创建好的远程子模块仓库为“[email protected]:account/sub-repo.git”。
git rm -r src/submodule_folder
git commit -m "remove submodule forlder." .
git submodule add -b master --name sub-origin-master [email protected]:account/sub-repo.git src/submodule_folder
git commit -m "add submodule 'sub-origin-master'." 
  1. 切换到分支重复上一步操作
git checkout br1
git commit -m "remove submodule forlder." .
git submodule add -b br1 --name sub-origin-br1 [email protected]:account/sub-repo.git src/submodule_folder
git commit -m "add submodule 'sub-origin-br1'." 
  1. 把所有子模块都添加进去之后,再把项目推送到远程空仓库就可以了。

参考链接

https://blog.csdn.net/furzoom/article/details/90606302

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章