1
摘要(此文章转载自乐字节)

本文乐字节给大家剖析了一个有趣的现象:IT 业界使用最广泛的版本管理系统 Git,却不被硅谷领先的科技公司 Google、Facebook 等垂青的原因。分析了 Google 的版本和分支管理模式、Git 的设计理念和存储结构,为企业 IT 的决策者提供一个版本管理系统技术选项的决策思路。
2
背景

版本控制系统(VCS,Version Control System),或叫源码管理系统(SCM,Source Code Management)是几乎所有 IT 人员都熟悉和每天工作使用的工具。提到 VCS,你会想到哪个工具?估计大部分人都会想到 Git,尤其对于 85 后年轻一代 IT 人,甚至可能只知道 Git 这一种版本管理工具。

Git 是目前最流行的代码版本管理工具。它最初由 Linux 之父 Linus Torvalds 开发出来,Linus 2007 年在某次演讲中提到他开发 Git 的几个准则:

•分布式:代码存储在多个机器、每个副本是平等的、支持离线工作

•高性能:每次 commit、branch、log、diff 等操作都非常快

•可靠:确保从 Git 签出(Checkout)的代码跟签入(Checkin)的代码完全一致除了 Git,业界流行的版本控制系统还有 Subversion、Mercurial 等。

3
问题

Git 是一个非常适合开源社区的优秀的版本管理系统。但包括 Google 和 Facebooke 等多个硅谷巨头都没有采用,微软 Windows 开发团队虽然用 Git,但用的是经过深度改造后的 Git。很奇怪,对不?

其实,Google 公司并非完全没有考虑过采用 Git,Linus 本人在 2007 年曾到 Google 公司进行过一次介绍 Git 的演讲,有兴趣的朋友可以参考:Linus 在 2007 年 Google Talk 上介绍 Git。当时 Google 采用一个商业软件 Perforce 作为代码版本管理工具,正为 Perforce 无法继续支持 Google 巨大代码仓库而寻觅替代方案。但最终 Google 选择了基于 Bigtable 自行研发版本管理工具 Piper,而没有采用 Linus 大神开发的、名满天下的 Git。

这到底是为什么呢?

4
答案

Git 并不比 Subversion 更好,它只是不同

首先,让我们来看看 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 官网强调的几个特性,我们来分析一下:

分布式和中心化,Git 和 Subversion 完全不同的思路;对于开源社区(比如 Linux),显然分布式更合理,但对于商业公司,恐怕中心化更方便运维和备份;2.Git 更强调低成本的分支(和合并),Subversong 也支持分支和合并,但更强调简易的模型和易用性;3.Git 强调的是轻量和快(性能),而 Subversion 强调多用途(不仅仅是代码,还支持二进制文件)和规模;

说法不同本质一致,强调数据的可靠性;代码是 IT 公司的核心资产,可靠性怎么强调都不为过;

都是开源和免费的软件;

Git 非常适合开源社区

开源社区的核心诉求是开放、自由、共创,因此对版本管理系统的需求是:

开发者随时都可以克隆和分叉任意一个代码库;

开发者都可以在自己的分叉或分支上为所欲为;

开发者可以按自己意愿把源码存储在任何机器上,不论是自己的 PC 还是 Github 服务器;

开发者可以发起合并回原代码库的请求(Pull Request),而是否接受则由原项目所有者决定。因此,Linus 设计的 Git 非常强调分布式(Distributed),以满足开源社区的代码存储自由;另外,极低成本的分支(branching)、分叉(fork)和合并(merge),满足开源社区自由分叉代码和合入的需求。

依托 Linus 本人的超级影响力,加上 Git 本身非常适合开源协作的特性,Git 几乎成为开源社区唯一的代码版本管理系统。

5
Git 并不特别适合企业

然而,Git 并不适合企业,尤其是企业中大型的软件系统。因为企业对源代码管理的诉求截然不同。源代码作为 IT 企业或企业的 IT 部门最核心的资产,管理需求是:

安全:包括代码权限(代码访问权限可控)和数据安全(不丢失、一致性);

易用性:简单的代码签出(Check-out)、嵌入(Check-in)、分支、合并等操作;

多种类的资源版本管理,包括源代码,也包括资源文件(图片、音乐、视频、设计文件等);

规模:支持数百 GB 甚至 TB 级规模的代码仓库,设想一个数千人的开发团队超过 10 年代码积累的大型软件,这个规模的代码仓库是完全可能的。而这,恰恰就是 Google 为例的大型 IT 公司所需求的。Linus 2007 年在 Google 的演讲中,2 名 Google 员工提出了 2 个问题:

如果你有一个超级超级大的代码库(repository),想用 Git 来管理,还不能让业务中断 6 个月,你怎么做?

使用 Git 怎么只 pull 代码库的其中一部分 path?Linus 大神没有正面回答这 2 个问题。

事实是:Git 做不到。

Git 之所以无法存储巨大的代码库,也无法 clone、pull、push 代码库文件树的某个分支,是由其存储结构和设计理念所制约的,并不是简单增加一个特性就可以解决的。这也是为什么 Google 员工 2007 年就向 Linus 提出这 2 个问题,但到今天为止,Git 仍然不能支持的根本原因。(后来版本的 Git 支持通过 filter 和 sparce checkout 只克隆 / 拉取某些目录的代码,但性能非常低)。

在 Git 对象模型里,所有对象都以 SHA-1 id 表述,包括 4 类对象:

1.blob:用于存储文件数据;

2.tree:可以理解为目录,它指向其他目录或 blob;

3.commit:一棵代码树的提交点;

4.tag:标记特别的提交(commit),通常用于标记某次发布;

其中,tag 和 branch 只是指向 commit 的一个指针。Git 的核心存储在于前 3 者。其结构如下图:

更详细的 Git 存储和访问机制,超出本文的范畴,关注本公众号,我将在未来分享。

6
源码管理系统的选型取决于研发流程

除了上面所述的考虑因素,源码管理系统的选型最重要的还是取决于研发流程,尤其是分支和版本关联

Google 的分支和版本管理原则包括:

基于充分测试的主干开发:这意味着并不需要太多分支、代码集中式存储;

基于大仓源码的主干依赖:就是把所有的模块和子工程都放在同一个代码仓库中,代码间以源码的主干版本为依赖,所以代码仓库会非常巨大。这 2 点,都是 Git 无法满足的。

综上所述,Git 并不适合类似于 Google、Facebook 等采用单体代码仓库、主干开发模式的 IT 企业。因此,Google 于 2007 年自行开发了一套版本管理系统 Piper。可惜 Google 并没有开源出来。

最终结果:Google 在 2007 年前采用商业软件 Perforce 作为其源码管理系统;2007 年后自行研发 Piper 替代;Facebooke 则采用经过深度改造的 Mercurial 系统。

Google 和 Facebook 这 2 个硅谷巨头都没有采用最留下的 Git 来管理源码,根本原因在于其研发流程的核心:

主干开发;

基于大仓源码的主干依赖;

7
总结

代码版本管理系统的技术选项,对于整个 DevOps 流程的效率和质量有着重要的影响,而且一旦选定,往往迁移成本极大。作为企业 IT 部门的决策者,务必非常审慎的做决策。建议至少从以下维度评估:

研发流程是主干开发,还是分支开发;

代码模块之间(包括对公司内部和第三方)的依赖,以制品(编译后的 jar、so 等二进制或字节码包)还是源代码形式;

版本发布模式:主干发布、还是分支发布;

代码的开放程度:是企业全部开放,还是需要局部开发;

代码的安全要求;经过多维度的评估,能让企业 IT 的决策者作出更准确的决策 (此文章转载自乐字节)

Google 和 Facebook 为什么不用 Git 管理源码?相关推荐

  1. Google和Facebook为什么不用Docker?

    点击关注公众号,Java干货及时送达 写作本文的起因是我想让修改后的分布式 PyTorch 程序能更快的在 Facebook 的集群上启动.探索过程很有趣,也展示了工业机器学习需要的知识体系. 200 ...

  2. Docker学习总结(55)——Google和Facebook为什么不用Docker?

    2007 年我刚毕业后在 Google 工作过三年.当时觉得分布式操作系统 Borg 真好用. 从 2010 年离开 Google 之后就一直盼着它开源,直到 Kubernetes 的出现. Kube ...

  3. 使用git管理源码之文件状态和工作区理解

    2019独角兽企业重金招聘Python工程师标准>>> 这次主要是介绍一下,在git管理中,不同文件在不同状态所处于不同位置的原理. 首先先盗图一张(ps:图片来源于http://g ...

  4. 你猜,为什么Google和Facebook不用Docker?

    前言 本文涉及的所有技术细节都在开源软件和论文中. 写本文的起因是我想让分布式 PyTorch 程序更快的在 Facebook 的集群上启动.探索过程很有趣.也展示了工业机器学习需要的知识体系. 20 ...

  5. 【IOS】Firebase(Google、Facebook、Apple、Guest)登录,FCM,Apple In-App,Kakao

    写在开头 记录自己接入SDK的过程.请各位指正. 最好提前做的工作 工欲善其事,必先利其器. 1.Mac电脑因Xcode而内存越来越大 弄到一半突然提示我内存不足,而且xcode还越来越卡.也是醉了. ...

  6. 断舍离:我彻底戒掉苹果、微软、Google、Facebook 和亚马逊之后?

    如今,纵使各大科技巨头桩桩劣迹在案,但我们最难放弃的大抵仍是它们带来的各种便捷的"免费"服务. 本文则记述了告别苹果.微软.Google.Facebook 和亚马逊后一个月的真实生 ...

  7. Google、Facebook等美国IT名企在面试中最看重什么?

    来源:https://www.zhihu.com/question/372648294 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删 特指美国一线的IT公司software engineer岗 ...

  8. 韬光养晦的Sony AI,凭什么与Google和Facebook平起平坐?

    作者 | 藏狐 来源 | 脑极体(ID:unity007) 伴随着感恩节气氛的日渐浓重,面对只剩下最后一个月份额的2019,奋进的.错失的,都已尘埃落定,是时候迎来盘点得失.清理思绪的冬藏时节了. 整 ...

  9. Google、Facebook、亚马逊、Uber等硅谷顶尖AI专家团北京聚首 ,这场AI开发者盛会不可错过

    9 月 14 日前购买早鸟票,将获千元优惠,数量有限,详情请戳:https://bss.csdn.net/m/topic/ai_nextcon/index 随着人工智能技术的飞速发展及应用推广,AI在 ...

最新文章

  1. $().html()对ie9无效,不注意这点,\9和\0就可能对hack IE11\IE9\IE8无效
  2. python自动化办公入门书籍推荐-用python进行办公自动化都需要学习什么知识呢?...
  3. java mysql 全文索引_MySQL索引原理
  4. 没有代码天赋的我,先退出了
  5. java 短信验证码===随机数
  6. Java数据库编程技术 第三章习题
  7. 三角形外接圆圆心计算公式
  8. CSS解读之box-sizing属性
  9. 相对url和相对路径
  10. 【ET500P】高清摄录,相位对焦
  11. 无法将数值apsdaemon写入键
  12. Java - GC是什么?为什么要有GC?
  13. 安卓逆向-new-sec6-5 平头哥框架hook简介 | 类加载器 | 内部类
  14. 数据挖掘和知识发现的技术、方法及应用
  15. 一文带你透析zookeeper原理
  16. 哈工程自考计算机应用数学,自考本科计算机应用数学 01332
  17. 重装战姬怎么用电脑玩 重装战姬模拟器玩法教程
  18. 企业中小型机房UPS电源及环境微信云监控解决方案
  19. 软件测试周刊(第58期):春光不必趁早,冬霜不会迟到。相聚离开,全部刚刚好。
  20. 超简单的魔幻霓虹灯文字特效 html+css

热门文章

  1. iOS-Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
  2. Minecraft Fabric模组开发 (四) 添加物品合成表
  3. 分子模拟的理论与实践_超级电容器储能机制的理论计算研究
  4. android 自定义adapter
  5. QQ头像的延时提示框
  6. 劲舞团连接服务器中断,劲舞团与服务器中断连接的解决办法有哪些?
  7. 文字打怪小游戏 源码(c++)
  8. 金仓数据库KingbaseES物理备份恢复最佳实践(数据恢复解决方案)
  9. [shiro] - 加入rememberMe功能
  10. nodejs+vue+elementui餐厅点餐系统