objgit Git backed by object storage

Architecture

objgitd is one binary. It stores git repositories as objects in a Tigris bucket. It does not keep repository data on a local filesystem.

The daemon is the shared backend

cmd/objgitd/main.go builds one *daemon. One errgroup then serves that daemon through all three transports at the same time.

The struct holds three fields, plus the hook configuration:

Field Type Purpose
sysFS billy.Filesystem Daemon-level state only, which is the SSH host key. Still internal/s3fs.
resolver repofs.Resolver Maps a repository path to its storage.
authz auth.Authorizer One decision point for every transport.

resolver.Resolve returns a go-git storage.Storer directly. No billy.Filesystem is involved in repository data. The production resolver is repofs.BucketResolver, and its Base field is an internal/storage/tigris.Storer over the single -bucket. Each repository gets its own key prefix of the form orgID/name through Storer.Scoped.

Three behaviors live on *daemon, so every transport acts the same way:

Pages

Page Contents
transports.md Smart HTTP, git://, and SSH. Two protocol points that are easy to get wrong.
auth.md The one authorization interface that every transport calls.
hooks.md Push hooks, webhook dispatch, live output streaming, and the kefka sandbox.
metrics.md Prometheus vectors and the three instrumentation seams.
snapshots.md erofs images of pushed trees, and the snapshot cache.
tigris-storer.md Repository storage: a storage.Storer on one Tigris bucket.
s3fs.md Daemon-level state: a billy.Filesystem on Tigris.
lfs.md Git LFS: presigned transfers, global blobs, per-repository markers.

Related documents outside this directory: