在对象存储上运行 Git 的秘诀

You can run Git on object storage if you re-make packfiles

我构建了一个基于对象存储的 Git 服务器项目 objgit,起初尝试用文件系统作为翻译层,但在处理 Linux 内核等大规模仓库时性能极差。问题出在 Git 的 packfiles 设计上,它们依赖本地存储的 mmap 机制,而对象存储的网络延迟是磁盘的百万倍。为了解决这个问题,我发明了一种原生适配对象存储的列式 packfile 格式。这种新格式允许通过 HTTP Range 请求精准获取数据,无需下载整个大文件,从而让 Git 在对象存储上也能高效运行,且无需修改任何客户端代码。

Git 本质上就是一堆可怜巴巴的对象!
  1. andrewaylett

    `git update-server-info` 是你的好朋友;它会生成必要的辅助文件,让客户端能够对 pack 发起范围请求(range requests)。

    例如:https://andrewaylett.github.io/rgitweb/ 就是一个针对静态 git 仓库运行的仓库查看器。它不在乎你把 pack 存在哪里,只要数据能支持正确的范围请求就行。

  2. delf

    这正是 GitSocial 在做的事情:https://gitsocial.org/。此外,它还能生成仓库的静态站点,让你可以直接从对象存储桶(bucket)中提供所有内容。

  3. flowingfocus

    我最近发现了 https://github.com/enroute-sh/enroute,它也能在对象存储上运行 git。

    我觉得 git 代理(git-proxy)这个概念挺有意思:先代理现有的 forge,然后再逐步迁移到对象存储后端。

  4. 0bytes

    3 天内第 4 次提交。这是某种营销垃圾邮件活动吗?

  5. pierrebarre

    或者直接用 https://github.com/Barre/ZeroFS

    它处理 git 工作负载效果极佳,哪怕是 Linux 级别的目录树也没问题。

同日更多故事

2026-09-19