【问题标题】:Is there an open source equivalent to piper, Google's version control tool?有没有相当于谷歌版本控制工具 piper 的开源软件?
【发布时间】:2025-12-17 22:30:01
【问题描述】:

Google 将其所有代码库存储在一个名为 piper [1][2][3] 的存储库中。

它的方法与开源替代方案(集中式“云”服务)截然不同,旨在扩展到包含数十亿文件、数千名开发人员和数百万次提交的存储库 [1]。

Google 似乎没有将其开源,也没有计划这样做(与他们的构建系统 blaze 和其他一些工具 [4] 相反)。

您是否知道任何采用类似于 piper 的方法的开源版本控制系统?

[1]https://cacm.acm.org/magazines/2016/7/204032-why-google-stores-billions-of-lines-of-code-in-a-single-repository/fulltext

[2]https://www.wired.com/2015/09/google-2-billion-lines-codeand-one-place/

[3]https://www.youtube.com/watch?v=W71BTkUbdqE

[4]https://opensource.google.com/projects/list/developer-tools?page=3

【问题讨论】:

  • 你需要存储20亿行代码吗?在基于免费云的 vcs bitbucket 方面非常慷慨。
  • 不是我自己,但我遇到过一些与此相差甚远的公司,目前使用数百个 git/hg/cvs 存储库,它们之间存在依赖关系。更新几乎所有存储库共享的“通用”组件的版本是一场噩梦。因此,这些版本很少见,并且其他存储库包含应该通用且重复的代码,因为它比将其集成到现有的通用存储库中更容易。还有其他可查找性、集成测试等问题......基本上,谷歌给出的使用单一存储库的所有原因。
  • 在那种情况下,我可能会看类似 SVN 的东西
  • svn?什么? (你拼错了“git”,对吧!?)
  • 声称“大量相互依赖的 repos”很复杂,并且“他们保留代码副本......”作为解决方案,这不是解决方案而是导致问题的原因。我不确定在这种情况下哪些语言在起作用(除了用具体示例进行说明之外,这无关紧要),但解决方案是继续使用单独的存储库,并将已发布的版本化工件发布到二进制存储库(例如 artifactory、nexus 等),并且在其他 repos 中仅使用版本声明依赖项。例如,查看所有基于 java 的开发(包括 Scala 和其他 jvm 语言)和 C/C++(Linux 开发)

标签: version-control dvcs


【解决方案1】:

简短的回答是不,它似乎不存在。

正如您在Quora article 中看到的那样,“很难判断版本控制系统在哪里结束,以及开发工具链的其他一些部分从哪里开始”。

因此,首先,您需要明确自己感兴趣的“功能”,因为您可能对 Piper 不负责的功能感兴趣。

另外,请记住,您的服务器磁盘空间和操作系统会在选择 VCS 之前限制文件计数/大小。

如果您需要集中式 VCS 和数十亿个文件,您可以使用 SVN 或 OpenCVS。

如果您需要拥有数千名开发人员和数百万次提交的分布式系统,请查看 Git、Bazaar、Bitbucket 或 Mercurial。

但是你真的有所有这些要求吗?

AFAIK 市场上没有 Piper 的开源等效产品。

为了更好地理解集中式和分布式VCS,看看this Comparison between Centralized and Distributed Version Control Systems

另外,看看what is Google's repository like?

【讨论】:

  • "请记住,您的服务器磁盘空间和操作系统会在选择 VCS 之前限制文件计数/大小" -> 这就是重点:Piper 并非如此。它是一个集中式 VCS,但却是一个分布式服务。 “云服务”方法允许“无限可扩展性”。存储库内容被分片。 “结帐”只是服务器端的元数据+安装“网络FS”。文件操作将 RPC 转换为维护“本地副本”状态的服务。好处:实际上,任何人都可以访问您的“本地副本”。
  • 因此,对于功能,我会说带有“熔断接口”的“分布式服务”,尽管它更多的是实现细节。可能还有其他方法可以实现“无限可扩展性”的真正需求。再加上您对 VCS 的期望,当然还有一些基本功能:历史、工作副本、更新和合并……我也觉得它在开源中不存在。一些专有解决方案声称这一点(perforce,塑料),但我不确定这是多么真实。
  • @ColinPitrat Perforce “声称”了这一点,但我没有用它来验证一次。我不知道任何具有 Google Piper 提供的资源的开源项目。现在,对您的问题的最佳简单答案是“不,没有类似于 Piper 的选项”。无论如何,绝大多数公司都远未需要“无限可扩展性”。请记住,Google Piper 只是 Google 使用的解决方案中的一款应用,涉及许多其他工具。
  • 是的,而且有些工具是开源的(例如:bazel),所以也开源 piper 似乎是合乎逻辑的。不知道为什么不是这样......
  • Google 在切换到 Piper 之前使用了 Perforce
【解决方案2】:

最近的两项发展为 Git 带来了类似 Piper 的功能:VFS for Git 和sparse-checkout

第一个:微软最近开源了VFS for Git,感觉像是把Piper的一些monorepo特性带到了Git。

VFS for Git 将您的 Git 存储库下的文件系统虚拟化,以便 Git 工具看到看似正常的存储库,而实际上这些文件实际上并不存在于磁盘上。 VFS for Git 仅在需要时下载文件。

VFS for Git 还管理 Git 的内部状态,因此它只考虑您访问过的文件,而不必检查存储库中的每个文件。这样可以确保状态和结帐等操作尽可能快。

Microsoft 将其用于 >300GB 存储库中的 >4000 名开发人员,在其 Windows Git 存储库中提交 >200 万次。

第二个:sparse-checkout for Git v2.25.0 允许您仅签出 monorepo 的一个子集。这应该会加速像git pullgit status 这样的命令。有关更多信息,请参阅this blog post。不幸的是,您必须使用 Git sparse-checkout 手动指定要检出的子目录,而 Piper 为开发人员透明地处理了这一点。

【讨论】:

  • Piper(不可用)的绝佳替代品,感谢发帖!
  • 现在可能值得在此处添加有关部分克隆的注释。
【解决方案3】:

Google 已经构建了不止一种版本控制工具。 Piper 专门满足 google monorepo 的需求。

当 google 构建 android 时,它构建了 gerrit 和 repo 来处理版本控制。 Repo 用于同时处理多个 git 存储库,每个存储库都可能有自己的维护者和发布周期。如果没有单个组织的控制来强制执行诸如全局构建状态或全局重构之类的事情,则开源依赖项不适合单存储库。此外,piper 的要求根本不适用于大多数地方,例如跟上请求的提交性能。

【讨论】:

  • TIL gerrit 来自 Google。
【解决方案4】:

没有与 piper 等效的开源软件。

请注意,piper 是旧的,并且有一个可追溯到 perforce era 的老式 API。我猜你会想要一个更现代的工作流程,类似于现代 DVCS 提供的工作流程。

我很确定您的代码库没有 Google 的 86TB 存储库那么大。你真的需要同样的东西吗?

我很确定您可以使用基于 gitmercurial 的 monorepo。并且可能演变为虚拟文件系统,例如 VFS for git 如果你需要的话。

【讨论】: