📌 项目地址:github.com/tobi/walgit | 星数:2,500+ | 协议:MIT | 语言:Rust
这个项目的作者栏写着 tobi——Shopify 创始人兼 CEO Tobias Lütke。他顺手实现了 Cursor 在博客《Git at any scale》里描述的 Continuity 架构(原文完整保留在仓库 docs 里)。核心思想一句话:把对象存储上的写前日志(WAL)当作唯一真相源,每台机器上的仓库都只是缓存。传统 git 托管的痛点是 packfile——一切都是压缩后的大二进制,专为小体积而非顺序读设计,每次 git 操作都是对几 GB 数据的随机漫游,所以「把仓库放 NFS」在大厂全都失败过,GitHub 的 Spokes 方案要靠本地 NVMe + 三阶段提交 + 固定副本集 + 数据库映射来续命。walgit 换了个活法:机器全挂也只损失「热度」,桶才是仓库。理解这套思想后,再看 《深入理解AI Infra》开源书 里「数据搬移决定一切」的论述,会有打通任督二脉的感觉。
| 特性 | 说明 |
|---|---|
| 零数据库零状态 | 无 DB、无 leader、无要紧本地状态,机器=一次性缓存 |
| Smart HTTP v0/v2 | 标准 fetch/push,git 客户端直接用 |
| Git LFS | 大文件开箱支持 |
| Web UI + JSON API | 浏览器看仓库,SDK 可编程 |
| 推送策略 | 每仓库可配 push policy |
| 大于机器的仓库 | 服务器可服务比自身内存/磁盘还大的仓库 |
| 完整溯源 | WAL 里每次推送每次 repack 可重放到任意点 |
# 1. 一个桶(任何 S3 兼容存储或 GCS)+ 一份配置
cat > walgit.toml <<'EOF'
[server]
listen = "0.0.0.0:8080"
public_url = "https://git.example.com"
auto_create_on_push = true
[server.auth]
mode = "token"
anonymous_read = false
tokens = [{ principal = "me", token_env = "WALGIT_TOKEN_ME", write = true }]
[store]
backend = "s3"
bucket = "my-walgit"
[store.s3]
endpoint = "https://s3.us-east-1.amazonaws.com"
region = "us-east-1"
EOF
# 2. 启动(就是这一个二进制)
WALGIT_TOKEN_ME=$(openssl rand -hex 24) walgit serve --config walgit.toml
# 3. 使用——推送到新名字即建仓
git -c http.extraHeader="Authorization: Bearer $WALGIT_TOKEN_ME" \
push https://git.example.com/acme/app.git main
Shopify CEO Tobias Lütke(GitHub ID:tobi)用 Rust 写的 git 服务器(GitHub 2.5k 星,MIT 协议):无数据库、无 leader、无要紧的本地状态。跑一个二进制、指向一个 S3 或 GCS 桶,就拥有 smart HTTP(v0/v2)拉取推送、Git LFS、浏览用 Web UI、带 SDK 的 JSON API、每仓库推送策略和 webhooks——而且服务器可以扩展到比机器本身还大的仓库。每台机器只是一次性缓存,桶才是仓库本体。
它是 Cursor 博客《Git at any scale》所述 Continuity 架构的 Rust 实现:把对象存储上的写前日志(WAL)作为唯一真相源,磁盘上的每个仓库都只是缓存。推送以不可变对象存进桶,只有重写一个小 manifest(compare-and-swap)后才可见——这个 CAS 就是共识本身,无需选举、法定人数或主节点。读一致性靠条件 GET(通常 304)检查变更;压缩由持锁者做一次并发布进日志,副本直接下载压缩包。所以 WAL 保证了完整溯源:每次推送和每次 repack 都可重放到任意时间点。
三步:1)写一个 walgit.toml 配置(server 监听地址/公网 URL/认证 token、store 指向 S3 桶);2)WALGIT_TOKEN=$(openssl rand -hex 24) walgit serve --config walgit.toml 启动;3)git -c http.extraHeader="Authorization: Bearer $WALGIT_TOKEN_ME" push https://git.example.com/acme/app.git main——推送到新名字即自动建仓(auto_create_on_push)。多加机器指向同一桶即水平扩展,机器全挂也只损失缓存热度。