GitHub 每个对象只存储一次吗?

Does GitHub store each object just once?

我正在做一个关于从 GitHub 存储大量存储库的项目。许多存储库共享许多对象。所以我想了解 GitHub 是否只将每个对象存储一次以节省存储空间,以及如何执行此操作(如果不是秘密的话)。

我还没有找到任何令人满意的答案,只是一些预测 GitHub 已经做到了。

GitHub 没有这样做。 GitHub 单独存储每个 "repository network",其中存储库网络是:

  • 原始存储库
  • 该存储库的复刻

每个 "repository network" 可以使用 Git 的 "alternates" 机制在它们之间共享 object。这允许 Git 考虑其他 object 数据库位置,而不仅仅是存储库中的正常存储。

当您在 GitHub 上创建存储库时,您会在磁盘上创建一个单一的裸存储库,并使用正常的 on-disk object 数据库进行备份。当您从该存储库创建复刻时,GitHub 将:

  1. 为存储库网络创建一个新的 "alternates" 区域。
  2. 将存储库的 object 移至备用区域。
  3. 设置原始存储库以了解新的备用区域
  4. 设置新分支以了解新的备用区域。

发生这种情况时,存储库网络将在它们之间共享 object。这意味着 object 在原始存储库和已分叉的存储库之间共享。

但这是共享 object 存储空间的限制。没有每个人都可以共享的 object 大数据库(出于可扩展性和安全性原因也不应该有)。

(注意:尽管我在 GitHub 的 Git 基础设施团队工作,但此信息不是机密信息。)

来源

这两个在 Git Merge 会议上的演讲讨论了 GitHub 的 git 存储库存储: