# Migrating from SVN to GitLab

> 原文：[https://docs.gitlab.com/ee/user/project/import/svn.html](https://docs.gitlab.com/ee/user/project/import/svn.html)

*   [Overview](#overview)
*   [Smooth migration with a Git/SVN mirror using SubGit](#smooth-migration-with-a-gitsvn-mirror-using-subgit)
    *   [SubGit prerequisites](#subgit-prerequisites)
    *   [SubGit configuration](#subgit-configuration)
    *   [Initial translation](#initial-translation)
    *   [SubGit licensing](#subgit-licensing)
    *   [SubGit support](#subgit-support)
*   [Cut over migration with svn2git](#cut-over-migration-with-svn2git)
*   [Contribute to this guide](#contribute-to-this-guide)

# Migrating from SVN to GitLab[](#migrating-from-svn-to-gitlab "Permalink")

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

## Overview[](#overview "Permalink")

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

1.  [Git/SVN Mirror](#smooth-migration-with-a-gitsvn-mirror-using-subgit) which:
    *   使 GitLab 存储库镜像 SVN 项目.
    *   Git 和 SVN 存储库保持同步； 您可以使用任何一个.
    *   简化迁移过程并允许管理迁移风险.
2.  [Cut over migration](#cut-over-migration-with-svn2git) which:
    *   将现有数据和历史记录从 SVN 转换并导入到 Git.
    *   是一劳永逸的方法，对较小的团队有用.

## Smooth migration with a Git/SVN mirror using SubGit[](#smooth-migration-with-a-gitsvn-mirror-using-subgit "Permalink")

[SubGit](https://subgit.com)是用于平稳，无压力的 SVN 到 Git 迁移的工具. 它创建本地或远程 Subversion 存储库的可写 Git 镜像，并且您可以根据需要同时使用 Subversion 和 Git. 它需要直接在文件系统级别与 Git 存储库通信时访问您的 GitLab 服务器.

### SubGit prerequisites[](#subgit-prerequisites "Permalink")

1.  安装 Oracle JRE 1.8 或更高版本. 在基于 Debian 的 Linux 发行版上，您可以阅读[本文](http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html) .
2.  从[https://subgit.com/download](https://subgit.com/download)下载 SubGit.
3.  将下载的 SubGit zip 存档解压缩到`/opt`目录. `subgit`命令将在`/opt/subgit-VERSION/bin/subgit` .

### SubGit configuration[](#subgit-configuration "Permalink")

在 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 文档](https://subgit.com/documentation/)网站.

### Initial translation[](#initial-translation "Permalink")

现在，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-licensing "Permalink")

以镜像模式运行 SubGit 需要[注册](https://subgit.com/pricing) . 开源，学术和启动项目免费注册.

### SubGit support[](#subgit-support "Permalink")

对于与 SubGit 的 SVN 到 GitLab 迁移有关的任何问题，您可以直接通过[support@subgit.com](mailto:support@subgit.com)与 SubGit 团队[联系](mailto:support@subgit.com) .

## Cut over migration with svn2git[](#cut-over-migration-with-svn2git "Permalink")

如果当前正在使用 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 文档](https://github.com/nirvdrum/svn2git) . 以下命令将检出存储库并在当前工作目录中进行转换. 在运行`svn2git`命令之前，请确保为每个存储库创建一个新目录. 转换过程将需要一些时间.

```
svn2git https://svn.example.com/path/to/repo --authors /path/to/authors.txt 
```

如果您的 SVN 信息库需要用户名和密码，请在上述命令中添加`--username <username>`和`--password <password>`标志. `svn2git`还支持排除某些文件路径，分支，标签等.请参阅[svn2git 文档](https://github.com/nirvdrum/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[](#contribute-to-this-guide "Permalink")

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