六七年前,我机缘巧合进入了代码托管行业,做过基于 Git 支持 SVN 客户端接入、Git 代码托管平台分布式、Git 代码托管读写分离、Git 代码托管高可用等工作,所幸学到了一些知识,积累了一些经验,本次分享我的一点经验之谈,希望对即将进入或者已在代码托管行业的朋友有所帮助。
Git 的发展历史 版本控制系统的发展历史版本控制系统历史悠久,最早的开源的版本控制系统可以追溯到几乎与 C 语言同时诞生的 Source Code Control System (SCCS),作者Marc J. Rochkind来自著名的贝尔实验室,他于 1973 年发布了 SCCS 的初始版本。SCCS 的寿命悠久,直到 2007 年再没有人维护而终结。SCCS 本质上是一种 Local Only 版本控制系统,如今网络快速发展,无法跟上时代的脚步只能消亡,同类型的 RCS 虽然维护至今,也鲜有人问津。
1986 年诞生的 CVS 是一款真正的自由软件,使用 GPL 协议发布。一个有趣的事实是:CVS 是 RCS 的前端,也就是说 CVS 将 RCS 从 Local Only 变成了 Client-Server 版本控制系统。随着 2000 年 Apache Subversion 诞生,CVS 的市场快速萎缩,到了 2008 年 CVS 不再维护,集中式版本控制系统渐渐也只剩 Subversion 在维护了。
最早的分布式版本控制系统是 1992 年诞生的 Sun WorkShop TeamWare,但它并没有发展的很好。从 2000 年到 2007 年,分布式版本控制系统如雨后春笋一样冒了出来,2005 年诞生的 Git 和 Mercurial 幸运流传开来,时至今日,Git 终于在版本控制领域独占鳌头。
Git 的发展史2005 年,开发 BitKeeper 的商业公司结束与 Linux 内核开源社区的合作关系,他们收回了 Linux 内核社区免费使用 BitKeeper 的权利。Linus Torvalds 花了十天时间编写了 Git 的第一个版本,Git 的故事由此展开。
Git 原本只能在 Linux 上运行,随着开源社区的参与,逐渐能在各个平台上运行。在 Windows 上,最初有两个方案,一个是让 Git 在 Cygwin 的环境下编译,Cygwin 是 Windows 上的 POSIX 兼容层,但缺陷是需要带一大堆 DLL。另一个方案是 msysgit,基于 MSYS 运行时,MYSY 是更小的 POSIX 兼容环境。到了 2015 年,msysgit 不再维护,主要开发者基于 MSYS2 环境推出了 Git for Windows,而 MSYS2 的核心运行时基于 Cygwin 进行了定制。值得一提的是,在 Git for Windows 中,Git 命令并不是基于 MSYS2 运行时,而是原生的 Windows 程序,到今天我们已经可以使用 Visual C++ 编译 Git 源码了,Git for Windows 的维护者 Johannes Schindelin 加入微软后,在 Windows 上使用 Git 的体验也越来越好。
2008 年 11 月 Shawn O. Pearce 写下了 libgit2 的第一个提交;2009 年 9 月,Shawn 写下了 JGit 的第一个提交。Libgit2/jgit 被代码托管平台,Git 客户端广泛使用,比如 GitHub 使用 libgit2 的 Ruby 绑定 rugged 提供页面读写存储库能力。遗憾的是 Shawn 已经离开这个世界两年多了。
再来回顾 Git 的一些大事件:2008 年 GitHub 诞生,是最成功的代码托管平台,几乎以一己之力带来了 Git 的繁荣;2008 年 BitBucket 诞生,最初 BitBucket 还支持 Mercurial,到了 2020 年已不再支持;2011 年 GitLab 诞生,而国内的 Gitee 也是基于 GitLab 发展而来的;2014 年 CODING 成立,国内国外代码托管平台百花齐放;2018 年,微软花费 75 亿美元收购 GitHub,大家才猛然发现,基于 Git 的代码托管平台已经有了这样大的价值。
Git 是一个充满活力的版本控制系统,每一年,Git 的开发者们都在将他们新的知识、经验实践到 Git 中。2018 年 5 月,在谷歌工作的 Git 开发者们发布了 Git Wire Protocol,这解决了 Git 协议中最低效的部分;到了 2020 年 10 月,Git 实验性地支持 SHA256 哈希算法,在 SHA1 被破解几年后,我们终于可以在 Git 中尝试淘汰 SHA1 了。
Git 的发展必然会挤占其他版本控制系统份额,随着 Git 越来越流行,更多的项目也从其他的版本控制系统迁移到 Git 上来:
编译器基础设施 LLVM 从 SVN 迁移到 Git
FreeBSD 从 SVN 迁移到 Git
GCC(仍处于迁移过程中)从 SVN 迁移到 Git
Windows 源码(已经迁移到 Git,使用 VFS for Git 技术)
VIM 迁移到 GitHub
OpenJDK 从 Mercurial 迁移到 Git
2016 年,Git 诞生11年之后,BitKeeper 宣布采用 Apache 2.0 许可协议开源,如果再回到 2005 年,BitKeeper 又会做出怎样的抉择呢?
Git 的存储原理对于代码托管从业人员来说,只了解 Git 的使用并不足以参与代码托管平台服务开发和架构优化等工作,所以了解 Git 的一些原理非常必要。
Git 的目录结构