将SVN代码仓库迁移至代码托管
本文以一个标准SVN布局的代码仓库为例介绍如何将已有SVN仓库迁移至代码托管,仓库目录结构如下图所示:
本文档提供两种方法进行SVN已有代码迁移,两种迁移方法都对SVN中的代码及操作记录进行了有效迁移,区别点在于方法一在迁移的过程中,将SVN中的branches、tags文件夹映射为Git中的分支及标签,这样做有利于后续继续基于代码托管服务进行开发,但是迁移过程较为繁琐。方法二操作方式简单,但是将SVN中的branches、tags文件夹进行平移,不利于后续的继续开发,您可以根据自己的实际场景进行选用。
- 项目开发过程中,仅有部分代码保存在SVN中:建议使用迁移方法一:Git Bash客户端导入进行迁移。
- 项目完成后,SVN中已有完整的项目代码:建议使用迁移方法二:HTTP在线导入进行迁移。
迁移方法一:Git Bash客户端导入
- 获取SVN代码库提交者信息。
- 通过TortoiseSVN将待迁移的代码仓库下载到本地。
- 进入本地SVN代码仓库(本文为KotlinGallery),在Git Bash客户端执行如下命令:
svn log --xml | grep "^<author" | sort -u | \awk -F '<author>' '{print $2}' | awk -F '</author>' '{print $1}' > userinfo.txt
执行完毕后,该目录下将生成文件“userinfo.txt”。
- 打开文件“userinfo.txt”,可看到文件中显示所有对该仓库有提交操作的提交者信息。
- 因为Git是用邮箱来标识一个提交者的,为了更好的将SVN已有的信息映射到Git仓库里,需要从SVN用户名到Git作一个映射关系。
修改“userinfo.txt”,使每一行中,svn作者 = Git作者昵称 <邮箱地址>,用如下格式表示映射关系:
- 建立本地Git仓库。
- 在本地新建一个空的Git仓库目录,并将步骤一中的“userinfo.txt”文件拷贝到该目录下。
- 在该目录下启动GitBash客户端,并执行如下命令克隆一个Git版本库。
git svn clone SVN仓库地址 --no-metadata --authors-file=userinfo.txt --trunk=trunk --tags=tags --branches=branches
命令行中的参数说明如下,请根据实际情况选择相应参数:
参数
说明
--no-metadata
阻止git导出SVN包含的一些无用信息。
--authors-file
SVN帐号映射到git帐号文件,所有svn作者都要做映射。
--trunk
主开发项目。
--branches
分支项目。
--tags
标签。
执行成功后,本地将生成一个Git仓库。
- 输入以下命令,进入“KotlinGallery”文件夹,并验证当前Git仓库分支结构。
cd KotlinGallery git branch -a
从图中可以看到所有SVN中的目录结构均以Git分支的形式迁移成功。
- 本地分支修正。
在步骤二中,使用git svn clone命令将SVN仓库中tags文件夹也作为分支进行保存,这个明显不符合Git的使用规范。因此在上传到代码托管仓库前,需要先对本地分支进行调整,使之更符合Git使用规范。
- 进入本地Git仓库中,使用Git Bash客户端执行如下命令,把tags分支变成合适的Git标签。
cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/ rm -Rf .git/refs/remotes/origin/tags git branch -a git tag
- 输入以下命令,把“refs/remotes”下面剩下的索引变成本地分支。
cp -Rf .git/refs/remotes/origin/* .git/refs/heads/ rm -Rf .git/refs/remotes/origin git branch -a git tag
- 输入以下命令,将trunk分支合入master分支,并删除trunk分支。
git merge trunk git branch -d trunk git branch -a git tag
- 进入本地Git仓库中,使用Git Bash客户端执行如下命令,把tags分支变成合适的Git标签。
- 本地代码上传。
- 参考设置SSH密钥/HTTPS密码,设置代码仓库SSH密钥。
- 通过如下命令将本地仓库与代码托管仓库进行关联,并推送master分支到代码托管服务的仓库。
git remote add origin CodeArts Repo仓库地址 git push --set-upstream origin master
推送成功后,登录代码托管服务,可在“代码 > 分支”页面中查看到当前仓库下的master分支。
- 输入以下命令,从本地推送其余分支至代码托管。
git push origin --all
推送成功后,可在“代码 > 分支”页面中查看到,当前仓库下新增了r1.1_hotfix分支。
- 输入以下命令,从本地推送tags至代码托管。
git push origin --tags
推送成功后,可在代码托管“代码 > Tags”页面中查看到当前仓库下已有标签“r1.0”与“r1.1”。