I taught a bucket to speak git | Tigris Object Storage
11 hours ago
- 作者使用billy——一个最初为go-git设计的抽象层——教会了一个“桶”像文件系统一样工作,从而在对象存储上实现Git操作。
- Git仓库由对象、树、提交和引用组成;对象是内容寻址且只追加的,非常适合Tigris对象存储。
- 将Git仓库存储在单机上会产生有状态服务和潜在故障;GitHub的规模迫使依赖挂载的文件系统。
- 替代方案如调用git二进制、libgit2或libgit2都有局限(例如进程终止、GPL问题或本地文件系统假设)。
- go-git是一个纯Go库,不依赖本地文件系统,使得objgit能通过billy接口与Tigris配合。
- Objgit成功支持通过HTTP、git://和SSH的推送/拉取,仓库在首次推送时创建,并包含优化指标。
- 关键挑战包括:对象存储缺乏原子重命名(通过Tigris的RenameObject解决)、包文件缓冲以及推送过程中过多的stat()调用。
- 通过本地缓存不可变包文件以及修复递归列表缓存以减少ListObjectsV2调用,解决了性能问题。
- Post-receive钩子在沙盒环境(kefka)中运行,访问受限,能实现类似CI的操作而不依赖网络或主机文件系统。
- 未来计划包括CI集成、Web界面和性能改进,强调在对象存储上实现无状态Git服务器。