从 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 先决条件
- 安装 Oracle JRE 1.8 或更高版本。在基于 Debian 的 Linux 发行版上,您可以关注这篇文章。
- 从 https://subgit.com/download 下载 SubGit。
- 将下载的 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