02.07 还在使用 SVN 的企业请注意,是时候迁移到 Git 了

前言

关于使用 Git 还是 SVN 进行版本控制的讨论一直存在,Git 和 SVN 的区别也十分明显:

2000 年 CollabNet 创建了 Subversion 项目,一晃 SVN 已经诞生 20 年了,截至 r1873568 SVN 主分支共有 59674 次提交,32 个开发者,288 次发布。2005 年 Linus Torvalds 创建了 Git,截至 de93cc14ab7e8db7645d8dbe4fd2603f76d5851f,git 主分支共有 58209 次提交,1343 个贡献者,742 次发布,诸如 Google,Microsoft,Facebook 这样的巨无霸公司都在使用 Git,Git 主要开发者来自 Google 和 Microsoft。

人多力量大,众人拾柴火焰高,贡献越多码越好,我们可以看到 SVN 只是缓慢变好,而 Git 却在飞速增强,到了今天为什么还不从 SVN 迁移到 Git?

Gitee 的功能

用户在使用 SVN 时,常用的功能有部分检出,目录权限控制等等,并一直以此来否定 Git 的进步。而随着 Git 的不断增强,Gitee 开发者的不断努力,Gitee 逐渐拥有了这些功能。

2019 年 5 月底,Gitee 新增只读目录支持,而 Git 本身是没有这个特性的,主流的 Git 平台一般会提供只读分支的功能,无法实现对个别文件或者文件夹的只读限制,但 Gitee 提供了这个功能。

2020 年 1 月 17 日,码云目前已经初步支持 Git 部分克隆,结合部分克隆和稀疏检出能够提供比 SVN 更好的部分检出体验。

Gitee 除了在 Git 功能上推陈出新,还在团队协作,企业管理上增加了很多功能,自定义权限管理更切合企业实际,任务,里程碑,成员周报能够让开发者异地完成诸多任务,并被考核。 2019 年度疫情爆发以来,各地交通管制,返程复工有诸多不便,使用 Gitee 远程工作正当其时,为什么还不从 SVN 迁移到 Gitee 呢?

将 SVN 存储库迁移到 Gitee

企业只需要在 Gitee 上创建空存储库,然后将 SVN 存储库转换成 Git 存储库推送到 Gitee,便完成了向 Gitee 的迁移。

使用 git svn 工具转换

将 SVN 存储库转换成 Git 存储库非常简单,使用 git 自带的命令便可以完成:

<code># convert repo to git repo
gitsvnclonehttps://example.io/path/svn/repo-Ttrunk-bbranches-ttags
gitremoteaddgitee git@gitee.com:example/name.git
gitpush-ugitee--all
/<code>

如果你以后无需追踪原有的 SVN 存储库,可以在 Push 之前运行:

<code>git branch -m trunk master/<code>

当存储库越来越大时,git svn 的缺陷便很明显了,转换耗时比较长,这也是 GCC 从 SVN 转成 Git 反反复复花了好几年的原因。

使用 svn2git(ruby) 转换

在 Github 上有个实用工具 svn2git,这个工具主要是简化了转换流程:

<code>sudo gem install svn2git
svn2git http://svn.example.com/path/to/repo
/<code>

这个工具能够提供更好的提交日志,唯一遗憾的是,自 2016 年以来便不再更新。

使用 svn-all-fast-export/svn2git 转换

KDE 的开发者开发了 svn-all-fast-export/svn2git 这个工具在服务器上将 SVN 存储库转换成 git 存储库,由于省去网络传输和检出,速度要远胜于 git svn/svn2git(ruby)。

KDE 开发者撰写了使用示例:UsingSvn2Git,这一工具使用难度较高,需要创建规则文件,如果存储库较小,不建议使用此类工具。

<code>create repository kdelibs
match /trunk/KDE/kdelibs/
min revision 123453
max revision 456789
repository kdelibs
branch master
end match
end repository
/<code>

使用 git-svn-fast-import 转换

Gitee 还移植了一个 SVN to Git 的工具 git-svn-fast-import,这个转换又快又简单:

<code>$ mkdir -p repo.git && cd repo.git
$ git init
$ git-svn-fast-import --stdlayout -r 0:100000 /path/to/svnrepo
progress Skipped revision 0
progress Imported revision 1
progress Imported revision 2
progress Imported revision 3
...
progress Imported revision 99999
progress Imported revision 100000
/<code>

Gitee 开发者曾用此工具为某私有化客户将存储库从 SVN 转到 Git。

在 Gitee 上使用 SVN 功能

随着开发者投入的逐步减少,使用 SVN 接入 Gitee 并不被提倡。

但是,如果你仍然想在迁移到 Gitee 后,使用落后的 SVN,你可以在项目设置页面打开 SVN,然后使用:

<code>svn co svn+ssh://gitee.com/example/repo
/<code>

这将使用 SVN Over SSH 的方式访问远程存储库,只需要配置好 SSH 公钥,便可免密使用 SVN 协议访问远程 Git 存储库。

总结

开发者为开发者,Gitee 不断改进 Git 的体验,愿更多的企业从 SVN 迁移到 Gitee,享受企业级项目管理和代码协作的一体化云平台。