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 无法满足的 。
最终结果:Google 在 2007 年前采用商业软件 Perforce 作为其源码管理系统;2007 年后自行研发 Piper 替代;Facebooke 则采用经过深度改造的 Mercurial 系统 。
Google 和 Facebook 这 2 个硅谷巨头都没有采用最留下的 Git 来管理源码,根本原因在于其研发流程的核心:
- 主干开发;
- 基于大仓源码的主干依赖;
代码版本管理系统的技术选项,对于整个 DevOps 流程的效率和质量有着重要的影响,而且一旦选定,往往迁移成本极大 。作为企业 IT 部门的决策者,务必非常审慎的做决策 。建议至少从以下维度评估:
- 研发流程是主干开发,还是分支开发;
- 代码模块之间(包括对公司内部和第三方)的依赖,以制品(编译后的 jar、so 等二进制或字节码包)还是源代码形式;
- 版本发布模式:主干发布、还是分支发布;
- 代码的开放程度:是企业全部开放,还是需要局部开发;
- 代码的安全要求;经过多维度的评估,能让企业 IT 的决策者作出更准确的决策 。
上文中,我们提到 Google 分支和版本管理的 2 个原则:主干开发、大仓源码的主干依赖 。这 2 点都跟国内业界大部分公司不同,读者可能会很疑虑 。对于第 1 点,可以参考本公众号的文章《Google 工程效能三板斧之 单体代码仓库》 。对于第 2 点,请期待后续分享 。
【Google 和 Facebook 为什么不用 Git 管理源码?】
推荐阅读
- 刘秀娶阴丽华了吗,刘秀和阴丽华有几个孩子
- 明仁宗和明宣宗,明朝宣德皇帝朱瞻基怎么死的
- 刘备拥有卧龙凤雏为什么没有一统天下呢?,为什么刘备得了凤雏和卧龙还不能得天下
- 网站是如何识别浏览器指纹的?
- 你想10分钟吃透synchronized锁的各种用法和注意事项?今天它来了
- 忍冬花的寓意和象征,红枫树的寓意和象征
- 苹果梨山楂煮水的功效,水果茶的功效和作用
- 窦漪房是一个什么样的人,窦漪房和窦婴是什么关系
- 雍正皇帝和年羹尧是什么关系,雍正年羹尧的儿子叫什么
- 解密:同治和慈禧是什么关系,同治到底怕不怕慈禧