146.md 7.4 KB
Newer Older
Lab机器人's avatar
readme  
Lab机器人 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
# 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 和其他版本控制系统进行迁移的说明.