从一定规模的代码库来看,您是否仍将拥有Git或是否有更专业的解决方案?

(也可以检出一部分代码库)

#1 楼

Git适用于monorepos,但存在一些问题:


您必须检出整个存储库。
您必须获取整个历史记录(通常-浅克隆是一个选项,但通常在实际的开发工作中没有用。)
从本质上讲,每个人都可以对每个目录进行读写访问。

Google,可能是最著名的monorepo用户,开发了Piper来满足他们的需求。但是您不是Google,因此他们的解决方案可能不是您的。

monorepo的主要优势之一是您可以进行全局更改(即无需版本控制)因为您可以在同一次提交中更改调用方和被调用方)。为此,您确实希望有一个统一的构建系统来跟踪整个存储库中的依赖关系。 Bazel是Google构建系统Blaze的开源提取,它尝试做到这一点(尽管它还很年轻,不成熟,并且缺少许多非Google使用所必需的功能)。裤子是Twitter上的类似系统。

如果您在进行这样的原子性更改时正在构建大量代码,那么您可能还想要一个构建农场,使您不必在自己的仓库上进行操作本地机器。同样,在更新时,您将需要一个功能强大的CI系统来处理所有内容的运行测试。

#2 楼

答案是:两者都有。为了满足“使用git”和“管理庞大的代码库”的约束,Microsoft开发了一个新的文件系统(以前他们使用的是Perforce的变体SourceDepot)。它是开源的,但是我没有使用它的亲身经历。

为什么要一个monorepo?最明显的原因是您可以在原子提交中修改API及其所有调用者。能够在整个代码库中进行git log搜索也具有优势...

#3 楼

对于大型代码库,人们有不同的看法。如果您说的是一家拥有100名工程师的公司,那么我认为Git应该仍然​​能够处理它。它是为满足Linux内核的需求而开发的,它本身并不是一个小项目。

独立于存储库的存储方式,您可能会遇到问题。例如,如果您使用的是大型Java代码,并且正在使用Eclipse或IntelliJ之类的工具,则它们将使用更多的内存,并且通常会变慢。

另一方面,可以选择操作一次性使用所有代码(例如,在应用重构或源代码转换时)是整体存储库的主要优点之一。

当您询问是否需要专用工具时,请确定某个代码大小,答案是肯定的。根据Google的说法,它可以说是世界上最大的C ++代码库,所有可用的工具(开源或商用)都不能满足其要求。他们最终开发了一个名为Piper的内部系统:


为什么Google在单个存储库中存储数十亿行代码
Google使用什么版本控制系统?为什么?


#4 楼

如果我正确理解,那么对软件仓库而言,单一/一致版本控制方案的基本需求就是将其应用于包含多个与松散相关的组件/子项目的软件项目中,而这些组件/子项目可以/另外可以在单独的存储库。

如果需要,类似的需要使用常规源存储库为多个源文件提供单一/一致的版本控制方案,每个源文件都有自己的独立修改历史记录。

使用实际的monorepo解决方案绝对是一种解决方案,但恕我直言,不是解决此需求的唯一方法。

另一种可能的方法是使用包含一个或多个清单的伞式项目存储库文件,其中包含每个单独的项目组件存储库的确切版本。

即使组件存储库的版本已通过独立的非原子提交进行了修改,也可以通过将所有相关组件存储库的版本更改合并到清单文件的单个提交中,简单地对项目本身进行统一管理( s)在伞形存储库中。

与迁移到实际的monorepo解决方案相比,这种方法具有多个优点:


无需更改现有的组件存储库
可以使用不同的存储库技术支持各种组件的混合
每个组件存储库仍可以独立开发和管理
添加/删除项目组件几乎是很简单的
集成第三方(上游)组件是整个过程都非常容易
项目历史可以保持得更加整洁,而不会因每个组件存储库更改的所有细节而受到污染(通常与其他组件无关)
无需担心大小/性能/可扩展性通过单个存储库,该解决方案本身具有高度可伸缩性。