# 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 johndoe = John Doe ``` 如果您的 SVN 储存库为标准格式(主干,分支,标签,而非嵌套),则转换很简单. 对于非标准存储库,请参见[svn2git 文档](https://github.com/nirvdrum/svn2git) . 以下命令将检出存储库并在当前工作目录中进行转换. 在运行`svn2git`命令之前,请确保为每个存储库创建一个新目录. 转换过程将需要一些时间. ``` svn2git https://svn.example.com/path/to/repo --authors /path/to/authors.txt ``` 如果您的 SVN 信息库需要用户名和密码,请在上述命令中添加`--username `和`--password `标志. `svn2git`还支持排除某些文件路径,分支,标签等.请参阅[svn2git 文档](https://github.com/nirvdrum/svn2git)或运行`svn2git --help`以获取有关所有可用选项的完整文档. 创建一个新的 GitLab 项目,您最终将在其中推送转换后的代码. 从项目页面复制 SSH 或 HTTP(S)存储库 URL. 将 GitLab 存储库添加为 Git 远程,并推送所有更改. 这将推送所有提交,分支和标签. ``` git remote add origin git@gitlab.com:/.git git push --all origin git push --tags origin ``` ## Contribute to this guide[](#contribute-to-this-guide "Permalink") 我们欢迎所有将扩展本指南的贡献,其中包括有关如何从 SVN 和其他版本控制系统进行迁移的说明.