您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Google 和 Facebook 为什么不用 Git 管理源码?

时间:2021-05-17 10:04:02  来源:今日头条  作者:技术联盟总坛

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 官网的介绍可以看出来:

Google 和 Facebook 为什么不用 Git 管理源码?

 

上表是 Git 和 Subversion 官网强调的几个特性,我们来分析一下:

  1. 分布式和中心化,Git 和 Subversion 完全不同的思路;对于开源社区(比如 Linux),显然分布式更合理,但对于商业公司,恐怕中心化更方便运维和备份;2.Git 更强调低成本的分支(和合并),Subversong 也支持分支和合并,但更强调简易的模型和易用性;3.Git 强调的是轻量和快(性能),而 Subversion 强调多用途(不仅仅是代码,还支持二进制文件)和规模;
  2. 说法不同本质一致,强调数据的可靠性;代码是 IT 公司的核心资产,可靠性怎么强调都不为过;
  3. 都是开源和免费的软件;

Git 非常适合开源社区

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

  1. 开发者随时都可以克隆和分叉任意一个代码库;
  2. 开发者都可以在自己的分叉或分支上为所欲为;
  3. 开发者可以按自己意愿把源码存储在任何机器上,不论是自己的 PC 还是 Github 服务器;
  4. 开发者可以发起合并回原代码库的请求(Pull Request),而是否接受则由原项目所有者决定。因此,Linus 设计的 Git 非常强调分布式(Distributed),以满足开源社区的代码存储自由;另外,极低成本的分支(branching)、分叉(fork)和合并(merge),满足开源社区自由分叉代码和合入的需求。

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

5Git 并不特别适合企业

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

  1. 安全:包括代码权限(代码访问权限可控)和数据安全(不丢失、一致性);
  2. 易用性:简单的代码签出(Check-out)、嵌入(Check-in)、分支、合并等操作;
  3. 多种类的资源版本管理,包括源代码,也包括资源文件(图片、音乐、视频、设计文件等);
  4. 规模:支持数百 GB 甚至 TB 级规模的代码仓库,设想一个数千人的开发团队超过 10 年代码积累的大型软件,这个规模的代码仓库是完全可能的。而这,恰恰就是 Google 为例的大型 IT 公司所需求的。Linus 2007 年在 Google 的演讲中,2 名 Google 员工提出了 2 个问题:
  5. 如果你有一个超级超级大的代码库(repository),想用 Git 来管理,还不能让业务中断 6 个月,你怎么做?
  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 者。其结构如下图:

Google 和 Facebook 为什么不用 Git 管理源码?

 

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

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

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

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

  1. 基于充分测试的主干开发:这意味着并不需要太多分支、代码集中式存储;
  2. 基于大仓源码的主干依赖:就是把所有的模块和子工程都放在同一个代码仓库中,代码间以源码的主干版本为依赖,所以代码仓库会非常巨大。这 2 点,都是 Git 无法满足的。

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

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

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

  1. 主干开发;
  2. 基于大仓源码的主干依赖;

7总结

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

  1. 研发流程是主干开发,还是分支开发;
  2. 代码模块之间(包括对公司内部和第三方)的依赖,以制品(编译后的 jar、so 等二进制或字节码包)还是源代码形式;
  3. 版本发布模式:主干发布、还是分支发布;
  4. 代码的开放程度:是企业全部开放,还是需要局部开发;
  5. 代码的安全要求;经过多维度的评估,能让企业 IT 的决策者作出更准确的决策。

8后记

上文中,我们提到 Google 分支和版本管理的 2 个原则:主干开发、大仓源码的主干依赖。这 2 点都跟国内业界大部分公司不同,读者可能会很疑虑。对于第 1 点,可以参考本公众号的文章《Google 工程效能三板斧之 单体代码仓库》。对于第 2 点,请期待后续分享。



Tags:Git   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1摘要本文给大家剖析了一个有趣的现象:IT 业界使用最广泛的版本管理系统 Git,却不被硅谷领先的科技公司 Google、Facebook 等垂青的原因。分析了 Google 的版本和分支管理模式...【详细内容】
2021-05-17  Tags: Git  点击:(228)  评论:(0)  加入收藏
Fossil 是一个集版本控制系统、bug 追踪、维基、论坛以及文档解决方案于一体的系统。• 来源:linux.cn • 作者:Klaatu • 译者:Xiaobin.Liu •(本文字数:5047,...【详细内容】
2021-03-01  Tags: Git  点击:(220)  评论:(0)  加入收藏
可以使用相同的机器用于工作和个人的 Git 提交,而无需手动重置你的配置。• 来源:linux.cn • 作者:Ramanathan M • 译者:geekpi •(本文字数:1870,阅读时长大约...【详细内容】
2020-11-13  Tags: Git  点击:(143)  评论:(0)  加入收藏
Git 是用来做啥的?想必码农朋友都知道,Git 是版本控制软件,是软件开发过程中团队协作不可或缺的软件。但是,作为版本控制软件的 Git ,能跟聊天工具扯上关系吗?这二者似乎毫无关系,...【详细内容】
2020-06-20  Tags: Git  点击:(51)  评论:(0)  加入收藏
作者:HelloGitHub-Prodesire前言在前面三篇介绍 argparse 的文章中,我们全面了解了 argparse 的能力,相信不少小伙伴们都已经摩拳擦掌,想要打造一个属于自己的命令行工具。本文...【详细内容】
2020-06-17  Tags: Git  点击:(46)  评论:(0)  加入收藏
作者:匿蟒链接:https://note.qidong.name/2018/01/gitpython有时,需要做复杂的 Git 操作,并且有很多中间逻辑。用 Shell 做复杂的逻辑运算与流程控制就是一个灾难。所以,用 Pytho...【详细内容】
2020-03-05  Tags: Git  点击:(73)  评论:(0)  加入收藏
对于所有版本控制系统,项目文件都位于远程服务器上,当您在本地计算机上完成工作时,可以将文件推送到远程服务器上。但是,决定使用集中版本控制系统(如SVN)还是分布式版本控制系统(...【详细内容】
2019-12-04  Tags: Git  点击:(111)  评论:(0)  加入收藏
花下猫语: 今天,我在查阅如何用 Python 操作 Gitlab 的时候,看到这篇文章,觉得还不错,特分享给大家。文中还提到了其它几种操作 Git 的方法,后续有机会的话,再陆续分享之~~作者:匿蟒...【详细内容】
2019-10-12  Tags: Git  点击:(94)  评论:(0)  加入收藏
昨天升级了一下Mac OS,重启后再打开IntelliJ,突然Git就不能用了,报了下面这样的错:...【详细内容】
2019-09-27  Tags: Git  点击:(199)  评论:(0)  加入收藏
引言本文整理自工作多年以来遇到的所有 Git 问题汇总,之前都是遗忘的时候去看一遍操作,这次重新整理了一下,发出来方便大家收藏以及需要的时候查找答案。一、必备知识点...【详细内容】
2019-09-02  Tags: Git  点击:(204)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条