Migrating from SVN to GitLab

原文:https://docs.gitlab.com/ee/user/project/import/svn.html

Migrating from SVN to GitLab

Subversion(SVN)是中央版本控制系统(VCS),而 Git 是分布式版本控制系统. 两者之间有一些主要区别,有关更多信息,请咨询您喜欢的搜索引擎.

Overview

SVN 到 Git 迁移的方法有两种:

  1. Git/SVN Mirror which:
    • 使 GitLab 存储库镜像 SVN 项目.
    • Git 和 SVN 存储库保持同步; 您可以使用任何一个.
    • 简化迁移过程并允许管理迁移风险.
  2. 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

  1. 安装 Oracle JRE 1.8 或更高版本. 在基于 Debian 的 Linux 发行版上,您可以阅读本文 .
  2. https://subgit.com/download下载 SubGit.
  3. 将下载的 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 . 为方便起见,将此路径分配给变量:

  1. GIT_REPO_PATH=/var/opt/gitlab/git-data/repositories/USER/REPOS.git

SubGit 将使该存储库与远程 SVN 项目保持同步. 为了方便起见,请将您的远程 SVN 项目 URL 分配给一个变量:

  1. SVN_PROJECT_URL=http://svn.company.com/repos/project

接下来,您需要运行 SubGit 来设置 Git / SVN 镜像. 确保代表拥有 GitLab Git 存储库所有权的同一用户运行以下subgit命令(默认情况下为git ):

  1. subgit configure --layout auto $SVN_PROJECT_URL $GIT_REPO_PATH

如有必要,请调整作者和分支机构的映射. 用您喜欢的文本编辑器打开:

  1. edit $GIT_REPO_PATH/subgit/authors.txt
  2. edit $GIT_REPO_PATH/subgit/config

有关 SubGit 配置选项的更多信息,请参阅SubGit 文档网站.

Initial translation

现在,SubGit 已经配置了 Git / SVN 存储库,运行subgit来执行将现有 SVN 修订版初始转换为 Git 存储库的操作:

  1. subgit install $GIT_REPO_PATH

初始翻译完成后,Git 存储库和 SVN 项目将通过subgit保持同步-新的 Git 提交将转换为 SVN 修订版,而新的 SVN 修订版将转换为 Git 提交. Mirror 透明地工作,不需要任何特殊命令.

如果您希望使用subgit执行一次性迁移,请使用import命令而不是install

  1. 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 安装.

  1. sudo gem install svn2git

在基于 Debian 的 Linux 发行版上,您可以安装本机软件包:

  1. sudo apt-get install git-core git-svn ruby

(可选)准备一个 authors 文件,以便svn2git可以将 SVN 作者映射到 Git 作者. 如果您选择不创建作者文件,则提交将不会归因于正确的 GitLab 用户. 有些用户可能不会认为这是一个大问题,而另一些用户则希望确保他们完成此步骤. 如果选择映射作者,则将需要映射 SVN 信息库中的更改中存在的每个作者. 否则,转换将失败,您将必须相应地更新作者文件. 以下命令将搜索存储库并输出作者列表.

  1. svn log --quiet | grep -E "r[0-9]+ \| .+ \|" | cut -d'|' -f2 | sed 's/ //g' | sort | uniq

使用最后一条命令的输出来构造作者文件. 创建一个名为authors.txt的文件,并在每行添加一个映射.

  1. janedoe = Jane Doe <janedoe@example.com>
  2. johndoe = John Doe <johndoe@example.com>

如果您的 SVN 储存库为标准格式(主干,分支,标签,而非嵌套),则转换很简单. 对于非标准存储库,请参见svn2git 文档 . 以下命令将检出存储库并在当前工作目录中进行转换. 在运行svn2git命令之前,请确保为每个存储库创建一个新目录. 转换过程将需要一些时间.

  1. 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 远程,并推送所有更改. 这将推送所有提交,分支和标签.

  1. git remote add origin git@gitlab.com:<group>/<project>.git
  2. git push --all origin
  3. git push --tags origin

Contribute to this guide

我们欢迎所有将扩展本指南的贡献,其中包括有关如何从 SVN 和其他版本控制系统进行迁移的说明.