一直以来,SVN(Subversion)和Git都是非常优秀版本控制工具,只不过近些年基于Git的GitHub/GitLab/极狐GitLab发展势头迅猛,让很多人忘记了SVN。今天文章的主题,将给大家解析如何从SVN迁移到极狐GitLab。
首先,是迁移的前提条件,其一是可用的SVN环境;其二是极狐GitLab账号(自建或SaaS均可,SaaS可登陆https://gitlab.cn,右上角登申请注册);其三是服务器至少一台。
其次,是SVN的安装和配置使用相关教程。
一、SVN的安装
执行如下命令即可在 Ubuntu 20.04上完成SVN的安装:
使用svn --version来检查安装是否成功:
二、SVN配置使用
SVN 可以通过 svn/http/https 协议来使用。
三、SVN 协议配置使用
在 SVN 服务器上创建一个 svn 的目录:
使用svnadmin命令创建一个svn项目:
接着就可以在 /var/www/svn/jh 目录下看到如下内容:
所有的配置信息都在conf目录下面:
修改passwd文件来完成用户验证设置:
修改authz文件来完成对用户权限的设置:
修改svnserve.conf文件完成对svnserver的设置:
接着执行如下命令,启动svnserver:
在另外一台服务器上,用svn客户端命令查看svn服务器配置过程是否正确:
$ svn checkout svn://your-svn-server-ip-or-domain/jh --username svn-username --password svn-password Checked out revision 0.
上述完成了svn服务器的配置以及用svn协议来使用svn。
四、HTTP/HTTPS协议配置使用
关于SVN HTTP/HTTPS的配置使用,可以参考SVN HTTP配置以及SVN HTTPS配置这两篇文章。下图展示了配置完HTTPS并用HTTPS来登录SVN的情况:
SVN到极狐GitLab的迁移
从SVN到极狐GitLab的迁移有两种方式:svn2git 和 SubGit。
下面先介绍使用svn2git来完成从SVN到极狐GitLab的迁移。
使用svn2git来迁移
svn2git的安装
svn2git是一个用来将项目从SVN迁移到Git的工具。其核心原理是使用 git-svn 来克隆svn仓库,然后做一些清理工作,以便branch和tags能被正确导入。
svn2git有多种安装方式,在安装了Ruby和Git的情况下,可以用如下命令安装:
基于Debian的Linux系统,可以用如下命令安装:
当然,极狐GitLab团队已经将编译好的二进制文件包托管到了极狐GitLab SaaS 上:https://jihulab.com/jihulab/customersuccess/common/svn2git/-/releases。下载解压即可使用。
可以用svn2git --help来查看是否安装成功:
$ svn2git --helpUsage: svn2git SVN_URL [options]Specific options:--rebase Insteadof cloning a new project, rebase an existing one against SVN--username NAME Username for transports that needs it (http(s), svn)--password PASSWORD Password for transports that need it (http(s), svn)--trunk TRUNK_PATH Subpath to trunk from repository URL (default: trunk)--branches BRANCHES_PATH Subpath to branches from repository URL (default: branches); can be used multiple times--tags TAGS_PATH Subpath to tags from repository URL (default: tags); can be used multiple times--rootistrunk Use this if the root level of the repo is equivalent to the trunk and there are no tags or branches--notrunk Do not import anything from trunk--nobranches Do not try to import any branches--notags Do not try to import any tags--no-minimize-url Accept URLs as-is without attempting to connect to a higher level directory--revision START_REV[:END_REV]Start importing from SVN revision START_REV; optionally end at END_REV-m, --metadata Include metadata in git logs (git-svn-id)--authors AUTHORS_FILE Path to file containing svn-to-git authors mapping (default: ~/.svn2git/authors)--exclude REGEX Specify a Perl regular expression to filter paths when fetching; can be used multiple times-v, --verbose Be verbose in logging -- useful for debugging issues--rebasebranch REBASEBRANCH Rebase specified branch.-h, --help Show this message
使用 svn2git 进行迁移
文章最开始的 svn 仓库有一个trunk分支,三个 branch(01,02,03),三个 tags(v1.0.0,v2.0.0,v3.0.0):
用户信息匹配(可选)
可以将 svn 的用户信息和极狐GitLab的用户信息做一个映射,以便代码提交信息可以和正确的极狐GitLab用户相互匹配。用下面的命令可以导出svn中用户的信息:
用下面的信息格式,将上述内容写入一个authors.txt 文件:
比如:
上述的 authors.txt 文件可以在后面用到。
使用svn2git检出svn代码并转换为Git仓库
如果需要做用户匹配,则需要在命令行后面加参数 --authors /path/to/authors.txt。同时,上述命令适用于具有标准目录结构(具有 trunk,branches,tags 等目录)的 svn 仓库。对于非标准的 svn 仓库,需要在迁移的时候通过 --branches,--tags 等参数来做 branch 和 tag 的映射,详细使用可以用 --help 来查看。
接着可以查看branch和tag:
在极狐GitLab上创建一个空仓库
登陆 https://jihulab.com,创建一个空仓库(如果还未进行注册,可以登陆 https://gitlab.cn,点击右上角进行注册)
添加远端仓库地址
推送本地代码到远端仓库
$ git push --all originCounting objects: 616,done.Delta compression using up to 2 threads.Compressing objects: 100% (424/424),done.Writing objects: 100% (616/616), 633.54 KiB | 0 bytes/s,done.Total 616 (delta 179), reused 616 (delta 179)remote: Resolving deltas: 100% (179/179),done.remote:remote: To create a merge requestfor01, visit:remote: https://jihulab.com/svn-2-git/svt-2-git/-/merge_requests/new?merge_request%5Bsource_branch%5D=01remote:remote:remote: To create a merge requestfor02, visit:remote: https://jihulab.com/svn-2-git/svt-2-git/-/merge_requests/new?merge_request%5Bsource_branch%5D=02remote:remote:remote: To create a merge requestfor03, visit:remote: https://jihulab.com/svn-2-git/svt-2-git/-/merge_requests/new?merge_request%5Bsource_branch%5D=03remote:remote:remote: To create a merge requestformaster, visit:remote: https://jihulab.com/svn-2-git/svt-2-git/-/merge_requests/new?merge_request%5Bsource_branch%5D=masterremote:git push --tags originCounting objects: 6,done.Delta compression using up to 2 threads.Compressing objects: 100% (4/4),done.Writing objects: 100% (6/6), 718 bytes | 0 bytes/s,done.Total 6 (delta 2), reused 5 (delta 2)To git@jihulab.com:svn-2-git/svt-2-git.git * [new tag] v1.0.0 -> v1.0.0 * [new tag] v2.0.0 -> v2.0.0 * [new tag] v3.0.0 -> v3.0.0
接着就可以在极狐GitLab界面上看到相应的 branch,tags 都推送成功了:
由于极狐GitLab的默认分支是 main,svn 转换过来的是 master,可以将 master 分支 merge 到 main 分支,后续以 main 分支开展后续工作,以避免一些不便。
使用SubGit来迁移
SubGit的安装
SubGit 安装的前提需要 JRE>1.8 的环境。然后直接在SubGit 官网[4]上下载安装包,解压即可:
通过subgit --version 命令来确认安装是否成功:
SubGit的配置
SubGit是安装在极狐GitLab服务器上的,因为它需要和服务器上的Repo文件系统进行直接通信,所以下面的操作流程适合自管理(Self-managed)版本的极狐GitLab 实例,如果是SaaS服务,则和下面的svn2git的方法类似。
首先需要设置一个空库用来做镜像,在极狐GitLab实例上面创建一个空仓库:
可以在极狐GitLab服务器的上找到这个仓库所对应的文件系统路径:
$ /var/opt/gitlab/git-data/repositories/@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.git$ cat config [core] repositoryformatversion = 0 filemode =true bare =true logallrefupdates =true autocrlf =false eol = lf symlinks =true[gitlab] fullpath = xiaomage/svn-2-git
将环境变量GIT_REPO_PATH的值设置为上述路径:
$ GIT_REPO_PATH=/var/opt/gitlab/git-data/repositories/@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.git
通过环境变量设置 svn 仓库的地址:
通过SubGit来设置Git/SVN的镜像:
至此,Git/SVN仓库之间的镜像已经设置成功,接着可以用subgit install命令来完成初始传输,也即让SVN的信息流向Git:
此后SVN仓库上的改动会自动同步至Git仓库,Git仓库侧的改动会自动同步至SVN仓库。比如,目前SVN仓库的代码目录结构如下:
在Git仓库侧的branch和tags信息为:
现在在SVN仓库侧,做一个修改,新建一个tag:
接着查看Git仓库的tag变化:
可以看到 v5.0.0这个tag已经从SVN侧同步到Git仓库侧了,在极狐GitLab上,可以看到如下的branch,tag界面:
install 命令是让 svn 仓库和 Git 仓库保持同步,如果只是想一次性从 svn 切到 Git,则直接使用 import 命令即可。
针对极狐GitLab SaaS 的话,由于无法准确获知 GIT_REPO_PATH 的值(非 admin),则可以将 GIT_REPO_PATH 设置。
为 GIT_REPO_PATH=/var/opt/gitlab/git-data/repositories/USER/REPOS.git,在执行 subgit install 之后,直接使用 svn2git 的方式:添加远端仓库,然后将 branch 和 tag 直接 push 到极狐GitLab SaaS 的空库上面。