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]>,下面第一行必需)

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

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

1
2
3
4
5
6
7
8
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

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

5.将多余的 branches 删除掉

1
2
3
4
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.列出并检查当前所有分支(此步骤可缺省)

1
git branch -r

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

1
2
cd .git
git init --bare

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

1
git remote add origin git@git.shuhai.net:shuhaiios/show.git

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

1
git push origin master --tags

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

可能会用到

1.相关 shell 命令

1
2
3
4
5
6
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.添加远程服务器地址时添加错误

1
2
3
4
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 未配置