从 SVN 迁移到极狐GitLab

Subversion (SVN) 是一个中央版本控制系统 (VCS),而 Git 是一个分布式版本控制系统,两者之间有一些主要区别。

SVN 到 Git 迁移有两种方法:

  • Git/SVN 镜像
    • 使极狐GitLab 仓库镜像 SVN 项目。
    • Git 和 SVN 仓库保持同步;您可以使用任何一个。
    • 平滑迁移过程并允许您管理迁移风险。
  • 过渡迁移
    • 将现有数据和历史从 SVN 转换并导入到 Git。
    • 是一种“一劳永逸”的方法,适用于较小的团队。

使用 SubGit 通过 Git/SVN 镜像平滑迁移

SubGit 是一个平滑、无压力的 SVN 到 Git 迁移的工具,它创建本地或远端 SVN 仓库的可写 Git 镜像,这样您就可以根据需要,同时使用 SVN 和 Git。 它需要访问您的极狐GitLab 服务器,因为它直接在文件系统级别与 Git 仓库进行交互。

SubGit 先决条件

  1. 安装 Oracle JRE 1.8 或更高版本。在基于 Debian 的 Linux 发行版上,您可以关注这篇文章
  2. https://subgit.com/download 下载 SubGit。
  3. 将下载的 SubGit zip 压缩包解压到 /opt 目录。subgit 命令位于 /opt/subgit-VERSION/bin/subgit

SubGit 配置

在极狐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 的文档网站。

初始转换

现在 SubGit 已经配置了 Git/SVN 仓库,运行 subgit 来执行将现有 SVN 修订初始转换到 Git 仓库中:

subgit install $GIT_REPO_PATH

初始翻译完成后,subgit 保持 Git 仓库和 SVN 项目同步 - 新的 Git 提交被转换为 SVN 修订,新的 SVN 修订被转换为 Git 提交。镜像工作透明,不需要任何特殊命令。

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

subgit import $GIT_REPO_PATH

SubGit 许可

以镜像模式运行 SubGit 需要注册。开源、学术和初创项目的注册是免费的。

使用 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

或者,准备一个作者文件,以便 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@jihulab.com:<group>/<project>.git
git push --all origin
git push --tags origin