Git objects are append-only, content-addressed blobs - they fit an object store like a key fits a lock. A Tigris engineer proved it by teaching a bucket to speak git, using billy and go-git to build a git server that stores everything in object storage, no local filesystem required.
Why Git's Storage Model Was Begging for Object Storage
Peel away the porcelain and a git repo is four things: objects (compressed blobs), trees (object maps acting like folders), commits (pointers to trees and parents), and refs (mutable pointers like branches and tags). New commits create new objects; old ones never change. That's pure append-only content-addressed storage, which maps directly to object storage semantics.
A fresh repo with one README.md yields exactly three objects:
.git/objects/
5e/b8151eb669aa4467b6dea2c4bce19183cd0b41
6a/6a8ecfcae2632152486aca3d9150ef83dedd66
f4/d2487a1c6d742c8037c0296ddf80625190bd80
The main ref points to the commit hash. Half of this infrastructure never mutates after write - a perfect match for Tigris internal model.
The Three Terrible Options for Hosting Git
Building a git server that doesn't depend on a local filesystem has historically been a horror show. Option one: shell out to the /usr/bin/git binary. Now your "library" is argv parsing and your error handling is screen-scraping. Option two: link into libgit and inherit load-bearing die() calls that kill the entire process. Option three: libgit2, a GPL-licensed C library with stalled development, archived Go bindings, and still an implicit assumption of a local filesystem.
Everyone (even GitHub) shells out to the git binary because there's no safe alternative. That makes git servers single points of failure, stateful anchors in stateless clouds. GitHub's uptime is heroic, but the architecture is a hack held together by mounted filesystems and C libraries that can't be trusted to crash gracefully.
gopkg.in/src-d/go-git.v4.git
go-git: The Pure-Go Escape Hatch
go-git is a complete pure-Go implementation of git protocols and data formats. It doesn't need cgo, doesn't need /usr/bin/git, and critically, its storage interface is written against billy - the same filesystem abstraction that the Tigris engineer already taught to speak object storage.
The billy interface was originally designed for go-git's needs. Every method exists because go-git requires it. So when you have a bucket that already quacks like a filesystem via billy, pointing go-git at it Just Works.
No more die() calls crashing your app. No more parsing stdout from git binary. No more GPL licensing nightmares. Just a Go-native git server where repositories live in a scalable, stateless object store.
This approach means your git server becomes as stateless and scalable as the object store underneath - no single point of failure, no file system to mount, just a bucket that speaks git.
Source: I taught a bucket to speak Git
Domain: tigrisdata.com
Comments load interactively on the live page.