Git storage
without the server.
A lightweight Git CLI extension that adds s3:// support and moves native packs and refs efficiently to the storage you control.
curl -fsSL https://github.com/robertpitt/git3/releases/latest/download/install.sh | sh
Local Git repository
Native object database
Native packs
Refs
refs/heads/main
git3
Git CLI extension
builds and verifies packs with native Git
S3-compatible storage
A bucket you control
Objects
objects/pack/*.pack
transactions/*.json
HEAD
Native Git
Real Git objects, packs, refs, commits, and tags.
Atomic updates
Conditional writes prevent lost concurrent changes.
Your storage
Use S3 or the compatible object store you trust.
Tiny extension
No server, daemon, database, or forge to operate.
Installation
Get started in minutes.
Install one binary, use the AWS credential chain you already have, and give Git an s3:// remote.
curl -fsSL https://github.com/robertpitt/git3/releases/latest/download/install.sh | sh
git remote add origin s3://my-bucket/repos/example
git push -u origin HEAD:refs/heads/main
How it works
Small by design.
git3 extends the Git CLI with s3:// remotes. Git invokes it for S3 URLs, while native Git still builds and verifies the packs that git3 maps efficiently onto object storage.
-
01
Git builds the pack
Native Git creates and verifies the same packfiles used by ordinary repositories.
-
02
git3 moves it
The extension uploads immutable packs and compact transaction records to your bucket.
-
03
S3 stores it
One conditional write publishes ref changes atomically and prevents lost updates.
Clone, fetch, pull, push, branches, tags, force-with-lease, and atomic pushes.
See supported commandsRequest efficiency
Small request footprint.
git3 stores packs instead of turning every Git object into a separate request. Normal clone, fetch, pull, push, and maintenance require no bucket listing and never delete S3 objects.
1
conditional GET
for a warm no-op fetch or pull
0
LIST requests
during normal Git operations
0
DELETE requests
unless you explicitly run GC
| Git action | GET | HEAD | PUT | LIST | DELETE | Typical request shape |
|---|---|---|---|---|---|---|
| No-op fetch / pull | 1 | 0 | 0 | 0 | 0 | One conditional HEAD-document read; zero Git-object bytes. |
| Incremental fetch / pull | 3 | 0 | 0 | 0 | 0 | HEAD, ref snapshot, and one small transaction pack. |
| Push one updated ref | 2 | 0 | 3 | 0 | 0 | Read HEAD + refs; write pack, descriptor, and atomic HEAD. |
| Delete a branch / tag | 2 | 0 | 2 | 0 | 0 | A logical ref update; stored packs remain immutable. |
| Cold clone, one compacted pack | 5+ | 2 | 0 | 0 | 0 | HEAD, refs, packset, then metadata and range reads for pack + index. |
Typical steady-state traces with no retries, one new transaction, an embedded log tail, and default 64 MiB download ranges. Additional transactions, log pages, large ranges, and multipart uploads add requests proportionally.
At the S3 request rates used in the benchmark, 10,000 no-op fetches cost about $0.0042; 10,000 typical small pushes about $0.167 in request charges.
Regional performance
Fast regional Git. Simple S3 storage.
Everyday Git operations stayed sub-second in the UK-to-London benchmark. Maintenance still runs locally, compacting transaction history without a server you need to operate.
Median warm no-op fetch
0.215s
7 samples
0.185–0.259s
Measured from a UK client against S3 Standard in eu-west-2. All seven warm no-op fetches completed in under 300ms through the normal public S3 endpoint.
0.477s
median small push
40.55 MiB/s
512 MiB incremental fetch
4 clients
simultaneous ref reads in 0.282–0.286s
Passed
full fsck after every completed clone
git s3 doctor origin
Check health, generation, live WAL, and whether maintenance is due.
git s3 maintenance origin
Compact at the default 32-transaction or 128 MiB WAL threshold.
git s3 fsck origin --full
Download and verify all live metadata and Git pack data.
git s3 gc origin
Preview reclaimable objects; execution is explicit, bounded, and resumable.