Migrating from SVN to GitLab
- Overview
- Smooth migration with a Git/SVN mirror using SubGit
- Cut over migration with svn2git
- Contribute to this guide
Migrating from SVN to GitLab
Subversion(SVN)是中央版本控制系统(VCS),而 Git 是分布式版本控制系统. 两者之间有一些主要区别,有关更多信息,请咨询您喜欢的搜索引擎.
Overview
SVN 到 Git 迁移的方法有两种:
- Git/SVN Mirror which:
- 使 GitLab 存储库镜像 SVN 项目.
- Git 和 SVN 存储库保持同步; 您可以使用任何一个.
- 简化迁移过程并允许管理迁移风险.
- Cut over migration which:
- 将现有数据和历史记录从 SVN 转换并导入到 Git.
- 是一劳永逸的方法,对较小的团队有用.
Smooth migration with a Git/SVN mirror using SubGit
SubGit是用于平稳,无压力的 SVN 到 Git 迁移的工具. 它创建本地或远程 Subversion 存储库的可写 Git 镜像,并且您可以根据需要同时使用 Subversion 和 Git. 它需要直接在文件系统级别与 Git 存储库通信时访问您的 GitLab 服务器.
SubGit prerequisites
- 安装 Oracle JRE 1.8 或更高版本. 在基于 Debian 的 Linux 发行版上,您可以阅读本文 .
- 从https://subgit.com/download下载 SubGit.
- 将下载的 SubGit zip 存档解压缩到
/opt
目录.subgit
命令将在/opt/subgit-VERSION/bin/subgit
.
SubGit configuration
在 GitLab 中镜像 SVN 存储库的第一步是创建一个新的空项目,该项目将用作镜像. 对于 Omnibus 安装,默认情况下,存储库的路径将位于/var/opt/gitlab/git-data/repositories/USER/REPO.git
. 对于从源安装,默认的存储库目录将是/home/git/repositories/USER/REPO.git
. 为方便起见,将此路径分配给变量:
GIT_REPO_PATH=/var/opt/gitlab/git-data/repositories/USER/REPOS.git
SubGit 将使该存储库与远程 SVN 项目保持同步. 为了方便起见,请将您的远程 SVN 项目 URL 分配给一个变量:
SVN_PROJECT_URL=http://svn.company.com/repos/project
接下来,您需要运行 SubGit 来设置 Git / SVN 镜像. 确保代表拥有 GitLab Git 存储库所有权的同一用户运行以下subgit
命令(默认情况下为git
):
subgit configure --layout auto $SVN_PROJECT_URL $GIT_REPO_PATH
如有必要,请调整作者和分支机构的映射. 用您喜欢的文本编辑器打开:
edit $GIT_REPO_PATH/subgit/authors.txt
edit $GIT_REPO_PATH/subgit/config
有关 SubGit 配置选项的更多信息,请参阅SubGit 文档网站.
Initial translation
现在,SubGit 已经配置了 Git / SVN 存储库,运行subgit
来执行将现有 SVN 修订版初始转换为 Git 存储库的操作:
subgit install $GIT_REPO_PATH
初始翻译完成后,Git 存储库和 SVN 项目将通过subgit
保持同步-新的 Git 提交将转换为 SVN 修订版,而新的 SVN 修订版将转换为 Git 提交. Mirror 透明地工作,不需要任何特殊命令.
如果您希望使用subgit
执行一次性迁移,请使用import
命令而不是install
:
subgit import $GIT_REPO_PATH
SubGit licensing
以镜像模式运行 SubGit 需要注册 . 开源,学术和启动项目免费注册.
SubGit support
对于与 SubGit 的 SVN 到 GitLab 迁移有关的任何问题,您可以直接通过support@subgit.com与 SubGit 团队联系 .
Cut over migration with svn2git
如果当前正在使用 SVN 存储库,则可以将该存储库迁移到 Git 和 GitLab. 我们建议您进行一次硬性转换-运行一次迁移命令,然后让所有开发人员立即开始使用新的 GitLab 存储库. 否则,很难保持双向同步更改. 转换过程应在本地工作站上运行.
安装svn2git
. 在所有系统上,如果已经安装了 Ruby 和 Git,则可以作为 Ruby gem 安装.
sudo gem install svn2git
在基于 Debian 的 Linux 发行版上,您可以安装本机软件包:
sudo apt-get install git-core git-svn ruby
(可选)准备一个 authors 文件,以便svn2git
可以将 SVN 作者映射到 Git 作者. 如果您选择不创建作者文件,则提交将不会归因于正确的 GitLab 用户. 有些用户可能不会认为这是一个大问题,而另一些用户则希望确保他们完成此步骤. 如果选择映射作者,则将需要映射 SVN 信息库中的更改中存在的每个作者. 否则,转换将失败,您将必须相应地更新作者文件. 以下命令将搜索存储库并输出作者列表.
svn log --quiet | grep -E "r[0-9]+ \| .+ \|" | cut -d'|' -f2 | sed 's/ //g' | sort | uniq
使用最后一条命令的输出来构造作者文件. 创建一个名为authors.txt
的文件,并在每行添加一个映射.
janedoe = Jane Doe <janedoe@example.com>
johndoe = John Doe <johndoe@example.com>
如果您的 SVN 储存库为标准格式(主干,分支,标签,而非嵌套),则转换很简单. 对于非标准存储库,请参见svn2git 文档 . 以下命令将检出存储库并在当前工作目录中进行转换. 在运行svn2git
命令之前,请确保为每个存储库创建一个新目录. 转换过程将需要一些时间.
svn2git https://svn.example.com/path/to/repo --authors /path/to/authors.txt
如果您的 SVN 信息库需要用户名和密码,请在上述命令中添加--username <username>
和--password <password>
标志. svn2git
还支持排除某些文件路径,分支,标签等.请参阅svn2git 文档或运行svn2git --help
以获取有关所有可用选项的完整文档.
创建一个新的 GitLab 项目,您最终将在其中推送转换后的代码. 从项目页面复制 SSH 或 HTTP(S)存储库 URL. 将 GitLab 存储库添加为 Git 远程,并推送所有更改. 这将推送所有提交,分支和标签.
git remote add origin git@gitlab.com:<group>/<project>.git
git push --all origin
git push --tags origin
Contribute to this guide
我们欢迎所有将扩展本指南的贡献,其中包括有关如何从 SVN 和其他版本控制系统进行迁移的说明.