本文给大家剖析了一个有趣的现象:IT 业界使用最广泛的版本管理系统 Git,却不被硅谷领先的科技公司 Google、Facebook 等垂青的原因。分析了 Google 的版本和分支管理模式、Git 的设计理念和存储结构,为企业 IT 的决策者提供一个版本管理系统技术选项的决策思路。
版本控制系统(VCS,Version Control System),或叫源码管理系统(SCM,Source Code Management)是几乎所有IT人员都熟悉和每天工作使用的工具。提到 VCS,你会想到哪个工具?估计大部分人都会想到 Git,尤其对于85后年轻一代 IT 人,甚至可能只知道 Git 这一种版本管理工具。
Git 是目前最流行的代码版本管理工具。它最初由 Linux 之父 Linus Torvalds 开发出来,Linus 2007年在某次演讲中提到他开发 Git 的几个准则:
除了 Git,业界流行的版本控制系统还有 Subversion、Mercurial等。
Git 是一个非常适合开源社区的优秀的版本管理系统。但包括 Google 和 Facebooke 等多个硅谷巨头都没有采用,微软 Windows 开发团队虽然用 Git,但用的是经过深度改造后的 Git。很奇怪,对不?
其实,Google 公司并非完全没有考虑过采用 Git,Linus 本人在 2007年曾到 Google 公司进行过一次介绍 Git 的演讲,当时 Google 采用一个商业软件 Perforce 作为代码版本管理工具,正为 Perforce 无法继续支持 Google 巨大代码仓库而寻觅替代方案。但最终 Google 选择了基于 Bigtable 自行研发版本管理工具 Piper,而没有采用 Linus 大神开发的、名满天下的 Git。
这到底是为什么呢?
首先,让我们来看看 Git 是否(比其他流行的版本管理工具)更好,甚至最好。以 Git 市占率成为第1前最流行的 Subversion(简称 SVN)来对比。
在美版知乎网站 StackOverflow 上曾经有一个问题《Why is Git better than Subversion?》,被采纳的高赞回答是这样说的:
Git is not better than Subversion. But is also not worse. It’s different.
是的,只是 different。有哪些不同呢?从 Git 官网的介绍和 Subversion 官网的介绍可以看出来:
| # | Git | Subversion |
|---|---|---|
| #1 | distributed | centralized |
| #2 | branching and merging | simplicity of its model and usage |
| #3 | small and fast | wide variety, from individuals to large-scale |
| #4 | data assurance | reliability |
| #5 | open source | open source |
上表是 Git 和 Subversion 官网强调的几个特性,我们来分析一下:
开源社区的核心诉求是开放、自由、共创,因此对版本管理系统的需求是:
因此,Linus 设计的 Git 非常强调分布式(Distributed),以满足开源社区的代码存储自由;另外,极低成本的分支(branching)、分叉(fork)和合并(merge),满足开源社区自由分叉代码和合入的需求。
依托 Linus 本人的超级影响力,加上 Git 本身非常适合开源协作的特性,Git 几乎成为开源社区唯一的代码版本管理系统。
然而,Git 并不适合企业,尤其是企业中大型的软件系统。因为企业对源代码管理的诉求截然不同。源代码作为 IT 企业或企业的 IT 部门最核心的资产,管理需求是:
而这,恰恰就是 Google 为例的大型 IT 公司所需求的。Linus 2007年在 Google 的演讲中,2名 Google 员工提出了2个问题:
Linus 大神没有正面回答这2个问题。
事实是:Git 做不到。
Git 之所以无法存储巨大的代码库,也无法clone、pull、push 代码库文件树的某个分支,是由其存储结构和设计理念所制约的,并不是简单增加一个特性就可以解决的。这也是为什么 Google 员工2007年就向 Linus 提出这2个问题,但到今天为止,Git 仍然不能支持的根本原因。
(后来版本的 Git 支持通过 filter 和 sparce checkout 只克隆/拉取某些目录的代码,但性能非常低)。
在 Git 对象模型里,所有对象都以 SHA-1 id 表述,包括4类对象:
其中,tag 和 branch 只是指向 commit 的一个指针。Git 的核心存储在于前3者。其结构如下图:
更详细的 Git 存储和访问机制,超出本文的范畴,关注本公众号,我将在未来分享。
除了上面所述的考虑因素,源码管理系统的选型最重要的还是取决于研发流程,尤其是分支和版本关联
Google 的分支和版本管理原则包括:
这2点,都是 Git 无法满足的。
综上所述,Git 并不适合类似于 Google、Facebook 等采用单体代码仓库、主干开发模式的 IT 企业。因此,Google 于2007年自行开发了一套版本管理系统 Piper。可惜 Google 并没有开源出来。
代码版本管理系统的技术选项,对于整个 DevOps 流程的效率和质量有着重要的影响,而且一旦选定,往往迁移成本极大。作为企业 IT 部门的决策者,务必非常审慎的做决策。建议至少从以下维度评估:
经过多维度的评估,能让企业 IT 的决策者作出更准确的决策。
上文中,我们提到 Google 分支和版本管理的2个原则:主干开发、大仓源码的主干依赖。这2点都跟国内业界大部分公司不同,读者可能会很疑虑。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2472/viewspace-2797571/ ,如需转载,请注明出处,否则将追究法律责任。