SVN迁移到Git

SVN迁移到Git,其实坑还是蛮多的。不过相比较SVN来说,Git还是有挺多优势的,踩这些坑还是值得的。(Tips:阅读本篇博客最好了解下版本管理的一些基本概念和模型,Git模型点击这里

下面我们来介绍迁移过程,整个过程大致分为两步:

  1. 搭建新的版本管理模型
  2. 旧代码和提交信息的迁移

搭建新的版本管理模型

因为SVN和Git的版本管理模型不同,而且可能一部分公司在使用SVN的过程中模型也不是很规范,所以需要重新搭建Git模型,如果之前在SVN上的使用的比较规范且模型和Git类似,可以直接在第二步(旧代码和提交信息的迁移)上迁移出来的仓库上开发。

我们需要做的操作如下:

1.在GitLab上建立一个新的代码仓库,并clone远程仓库到本地,文件夹名称为XXX

2.将需要迁移的最新版本的SVN代码(此处是工程的最新版本的代码,并不是SVN上对应仓库的全部代码)更新下来,并复制到XXX文件下

3.将XXX文件下的代码提交,并推送到Git远程仓库,然后按照之前的Git模型管理即可

以上就是搭建新的版本管理模型的过程,实际上就是将最新的版本的代码按照新模型托管到Git服务器上,熟悉基本的Git和SVN操作就能实现,网上相关的介绍也挺多,这里就不再做详细描述了。另外我们还有SourceTreeSmartSVN等神器。

在代码上传过程中如果遇到因为单个文件过大造成的上传失败的问题时,采用SSH方式上传即可。

旧代码和提交信息的迁移

下面我们着重介绍旧代码和旧的提交信息的迁移,因为这部分只是用作对历史提交的记录,因此需要新建一个仓库用来存储,而且后续也不在此仓库上开发。

迁移步骤

假设想要将SVN项目检出到myGit文件夹下

1.在要迁移的文件夹下添加SVN用户到Git用的映射文件,文件名为:userinfo.txt.

文件内容为:([SVN上的名字] = [Git上的名字] <[Git上的email]>,下面第一行必需)

VisualSVN Server = Visual SVN Server\<admin@showjoy.com\>
shuhai=shuhai\<shuhai@showjoy.com\>

2.使用git svn clone命令克隆一个Git版本库,包含SVN里面的trunk、branches和tags。

git svn clone <SVN地址> --no-metadata --authors-file=userinfo.txt --trunk= trunk --tags=tags --branches=branches --ignore-refs=<忽视的分支> gitName

参数–no-metadata表示阻止Git导出SVN包含的一些无用信息
参数–authors-file表示SVN账号映射到Git账号文件,所有svn作者都要做映射
参数–trunk表示主开发项目
参数–branches表示分支项目
参数–ignore-refs表示不包含后面的分支项目(可缺省)
参数gitName表示Git项目名称

3.上述步骤成功,则可通过git log 查看项目提交的历史记录,包括作者,日照,和提交注释信息等,证明SVN相应的提交信息已经被克隆到本地仓库

4.将SVN上的tags分支转为tags

git tag mobile_1.0.0 tags/mobile_1.0.0
git tag mobile_1.0.1 tags/mobile_1.0.1

5.将多余的branches删除掉

git branch -r -d tags/mobile_1.0.0
Deleted remote branch tags/mobile_1.0.0 (was d50002b).
git branch -r -d tags/mobile_1.0.1
Deleted remote branch tags/mobile_1.0.1 (was e7b78a2).

6.列出并检查当前所有分支(此步骤可缺省)

git branch -r

7.建立Git仓库并初始化版本库(克隆后默认初始化,可缺省,若遇到没初始化的情况,请在仓库文件夹下cd .git初始化,该文件为隐藏文件)

cd .git
git init --bare

8.添加远程Git服务器地址(建议先在远程建立好对应的仓库)

git remote add origin git@git.showjoy.net:showjoyios/tashow.git

9.使用git push命令推送全部的分支和标签信息到git服务器上面

git push origin master --tags

10.推送代码完成后就可以在服务器上看到对应的代码和提交记录了,其他人员就可以克隆使用Git仓库了

可能会用到

1.相关shell命令

mkdir <filename>  建立文件夹
出现Permission denied提示时请在命令前加sudo以管理员权限执行

sudo rm -rf <filePath>  删除文件目录
-r 就是向下递归,不管有多少级目录,一并删除
-f 就是直接强行删除,不作任何提示的意思

2.ssh方式使用git

a.输入命令cat ~/.ssh/id_rsa.pub检查本地是否有SSH Key,如果有可以跳过b、c两步

b.输入命令ssh-keygen -t rsa -C "<git邮箱>"生成SSH Key

c.输入命令cat ~/.ssh/id_rsa.pub查看Key值

d.在GitLab/GitHub等Web服务页面用户SSH设置那里把相应Key设置进去

e.愉快的使用SSH Key方式使用Git

遇到的问题

1.提示Author: VisualSVN Server not defined in userinfo.txt file错误

解决方法:在userinfo.txt添加VisualSVN Server = Visual SVN Server\<admin@yourdomain.com>配置即

2.添加远程服务器地址时添加错误

git remote -v 查看当前绑定的远程地址
git remote remove <repo> 移除绑定的远程仓库
git remote set-url --delete origin http://git.showjoy.net/showjoyios/tashow.git 移除仓库绑定的远程地址(origin只有一个绑定的远程地址时不可移除,必须添加一个新的才能移除)
git remote set-url --add origin git@git.showjoy.net:showjoyios/tashow.git 添加仓库远程地址

3.错误Write failed: Broken pipe; git error: pack-objects died of signal 13

同错误4,采用ssh方式上传即可,如果还是不行,重启一下电脑吧,有奇效(据说是终端长时间打开会造成网络连接失败)

4.错误fatal: The remote end hung up unexpectedly,单个文件过大超出gitlab限制

采用ssh方式上传即可

5.错误Warning: Permanently added the RSA host key for IP address ‘222.186.133.56’ to the list of known hosts.

Permission denied (publickey).

fatal: Could not read from remote repository.

ssh公钥key未配置