更新时间:2023-07-25 GMT+08:00

将SVN代码仓库迁移至代码托管

本文以一个标准SVN布局的代码仓库为例介绍如何将已有SVN仓库迁移至代码托管,仓库目录结构如下图所示:

本文档提供两种方法进行SVN已有代码迁移,两种迁移方法都对SVN中的代码及操作记录进行了有效迁移,区别点在于方法一在迁移的过程中,将SVN中的branches、tags文件夹映射为Git中的分支及标签,这样做有利于后续继续基于代码托管服务进行开发,但是迁移过程较为繁琐。方法二操作方式简单,但是将SVN中的branches、tags文件夹进行平移,不利于后续的继续开发,您可以根据自己的实际场景进行选用。

迁移方法一:Git Bash客户端导入

  1. 获取SVN代码库提交者信息。

    1. 通过TortoiseSVN将待迁移的代码仓库下载到本地。
    2. 进入本地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”

    3. 打开文件“userinfo.txt”,可看到文件中显示所有对该仓库有提交操作的提交者信息。
    4. 因为Git是用邮箱来标识一个提交者的,为了更好的将SVN已有的信息映射到Git仓库里,需要从SVN用户名到Git作一个映射关系。

      修改“userinfo.txt”,使每一行中,svn作者 = Git作者昵称 <邮箱地址>,用如下格式表示映射关系:

  2. 建立本地Git仓库

    1. 本地新建一个空的Git仓库目录,并将步骤一中的“userinfo.txt”文件拷贝到该目录下。
    2. 在该目录下启动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仓库。

    3. 输入以下命令,进入“KotlinGallery”文件夹,并验证当前Git仓库分支结构。
      cd KotlinGallery
      git branch -a

      从图中可以看到所有SVN中的目录结构均以Git分支的形式迁移成功。

  3. 本地分支修正。

    步骤二中,使用git svn clone命令将SVN仓库中tags文件夹也作为分支进行保存,这个明显不符合Git的使用规范。因此在上传到代码托管仓库前,需要先对本地分支进行调整,使之更符合Git使用规范。

    1. 进入本地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

    2. 输入以下命令,把“refs/remotes”下面剩下的索引变成本地分支。
      cp -Rf .git/refs/remotes/origin/* .git/refs/heads/
      rm -Rf .git/refs/remotes/origin
      git branch -a
      git tag

    3. 输入以下命令,将trunk分支合入master分支,并删除trunk分支。
      git merge trunk
      git branch -d trunk
      git branch -a
      git tag

  4. 本地代码上传。

    1. 参考设置SSH密钥/HTTPS密码,设置代码仓库SSH密钥。
    2. 通过如下命令将本地仓库与代码托管仓库进行关联,并推送master分支到代码托管服务的仓库。
      git remote add origin CodeArts Repo仓库地址
      git push --set-upstream origin master

      推送成功后,登录代码托管服务,可在“代码 > 分支”页面中查看到当前仓库下的master分支。

    3. 输入以下命令,从本地推送其余分支至代码托管。
      git push origin --all

      推送成功后,可在“代码 > 分支”页面中查看到,当前仓库下新增了r1.1_hotfix分支。

    4. 输入以下命令,从本地推送tags至代码托管。
      git push origin --tags

      推送成功后,可在代码托管“代码 > Tags”页面中查看到当前仓库下已有标签“r1.0”“r1.1”

迁移方法二:HTTP在线导入

首先确保你的SVN服务器支持HTTP或HTTPS方式访问,可以在任一浏览器,输入“http(s)://SVN服务器地址/访问仓库名称”进行验证。

  1. 在代码托管仓库列表页,单击“普通新建”旁的,在下拉列表中选择“导入外部仓库”
  2. 源仓库路径填入要导入的SVN仓库地址,输入相应SVN用户名、密码,勾选“我已阅读并同意《隐私政策声明》和《软件开发服务使用声明》”,单击“下一步”

    输入要新建的代码仓库名称,进行相应权限配置,单击“确定”,等待仓库创建。

  3. 代码仓库创建成功后,单击仓库名称查看仓库详情。