关于代码的管理问题已经讨论多年,随着企业业务的复杂度提高、软件行业技术栈的选择度变宽泛,现代软件的代码仓库也变得越来越庞大和复杂。一个中型项目,将测试代码、核心业务代码、编译构建、部署打包等基础设施的代码全部加起来,几十万行都是家常便饭。并且一个项目往往由多个团队进行协作,如何让多团队在对同一个项目的代码进行协作时不会相互干扰、相互制约,也是每个企业研发团队在实践中不断摸索的难题。
多仓库与单仓库
对于上文所说的一些问题,业界已经归纳了常见的代码仓库存放方式,常见的如单仓库和多仓库。大部分企业会针对不同的项目采用不同的仓库管理机制,所以对于企业来说,经常会两种方式并存:
- 单仓库
将所有项目代码存放在一个代码仓库当中,这个好处在于项目的所有开发者可以共享看到项目中的所有代码;在项目规模较小的时候,一个库可以更好地管理和维护,发版本只要统一发布即可;对于持续集成,也只需要针对一个库维护若干条流水线。但再好的实践以及工具都有它适用的范围。Git 已经是非常流行的代码托管工具,但 Git 会把所有历史记录以及代码同步到各个用户的本地机器,所以对于大型项目而言,如果使用单仓库,就意味着某个模块开发者的本地可能有大量冗余代码和提交记录的信息,这个时候拆分成更小的库显得更加合适。
谷歌与 Facebook 就是业界典型的单仓库派代表。作为代码行数已经超过数十亿行、commit 数量累计达到千万次的团队(2015 年的统计数据),如果没有强悍的基础设施,也很难运转顺利。Google 曾发表论文介绍其强大的代码管理系统 Piper 以及客户端工具 CitC,但对于大部分企业