iGit自助迁移SVN工程解密

19年Q2集团整体启动SVN到Git迁移项目,12个事业群目前共迁移了3000+工程、240G代码库。 在整个迁移过程中,何如保证平滑、稳定是重要基础工作。 通过Git迁移的底层技术栈,解密版本管理工具差异性和迁移原理,能高效的解决日常项目实践中遇到的问题。

版本管理工具理念的差异性

Git目标特性

  • 速度极快,几乎所有操作都可以在本地执行;

  • 简单的设计;

  • 对非线性开发模式的强力支持(允许成千上万个并行开发的分支);

  • 完全分布式;

  • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)。

直接记录快照,而非差异比较

SVN与Git主要差异在与对待版本数据的方法。

SVN将保存的信息看作是一组基本文件和每个文件随时间逐步积累的差异。

Git对当时的全部文件制作一个快照并保存这个快照的索引,随着时间的变化,它只保留一个链接指向之前存储的文件,更像是一个快照流。 并且每当存储数据时都会产生SHA-1散列哈希值。

Git SVN桥接工具介绍

桥接工具命令格式为: git svn [] []。

通过clone命令可以从指定位置的svn目录创建一个新的仓库,并且带有当前地址的完整提交信息。

$ git svn clone SVNURL –authors-file=users.txt–no-metadata -s icode-git

创建users.txt映射关系如下: (此步骤可以跳过)

SVN用户名 = Git邮箱

……

配置远程仓库地址,指定组和工程名称,并推送到远程中央仓库。

$ git remote add origin Git域名:Group/Project.git
$ git push origin --all

桥接工具通过SVN上的文件数据+每次提交的差异文件,产生Git的底层树对象、提交对象、数据对象的时间快照索引。

详见官方源码文件https://github.com/git/git/blob/master/git-svn.perl

自助迁移功能设计

接入层

提供上层用户接入API,完成Git迁移工作。

Git导入线程:   过分布式锁控制单个SVN工程串行导入,防止多用户重复导入产生多源码地址。

Shell脚本:   重点迁移逻辑,具体执行内容参见Git SVN桥接工具介绍。

轮询调度:  轮询获 取SVN工程导入状态,并配置超时自动终止异常情况。

SVN权限模块:  行指定SVN目录写权限回收,防止用户同时使用SVN和Git,产生部分源码丢失现象。

邮件周知:  通知工程迁移人、工程成员、管理员,迁移后的Git地址以及版本流操作帮助。

基础层

iGit高可用服务是通过Proxy组件路由访问控制,由Sharding服务管理元数据和存活服的多级代码仓库,完成代码库请求的无感知切换功能。

参考链接

1. Git中文手册:

https://git-scm.com/book/zh/v2

2. Git 参考手册: https://git-scm.com/docs/git-svn

3. Git 源码地址: https://github.com/git/git