自建 Git 服务器怎么省成本?walgit 单二进制直接怼对象存储上
Tobi Lütke(Shopify CEO)把 Cursor《Git at any scale》里的 Continuity 架构用 Rust 落地成 walgit:没数据库、没 master、没重要本地状态,一个二进制指向 S3/GCS 桶就有 smart HTTP fetch/push、bundle-uri 克隆、Git LFS、Web 管理界面、JSON API 和 webhook,单机能服务比它自身更大的仓库。适合受够自建 Git 复杂度的团队,以及想把仓库托管成本压到只剩对象存储的人。
这是什么
walgit(tobi/walgit)是 Shopify CEO Tobi Lütke 用 Rust 写的一个 Git 服务器,核心思路一句话:没有数据库、没有 leader、没有重要的本地状态,你只需跑一个二进制、指向一个 S3(或任何 S3 兼容对象存储 / GCS)桶,就得到了完整的 Git 托管能力。
它的定位是把 Cursor 那篇《Git at any scale》里描述的架构(Cursor 内部叫 Continuity)搬到「比仓库还小的机器」上。作者 README 里直说:Git 是分布式的,但托管它的痛点全在 packfiles——仓库被压成不可按顺序读的大二进制包,每一次 git 操作都在跟这些大包搏斗。walgit 的解法是把「仓库变成对象存储里的一个 WAL(write-ahead log)」,每个节点只是可丢弃的缓存,真正的仓库是那个桶。
亮点
- 单二进制、零依赖:一个
walgit serve就是全部部署,不灌数据库、不配集群。 - 规模无上限:仓库大于运行它的机器也能服务(对象存储托管 blob,历史 pack 走 HTTP range 读)。
- 完整 Git 协议:smart HTTP v0/v2(ls-refs 带前缀、fetch 带 filter/shallow/deepen/sideband-all、receive-pack 支持 atomic/deletes/tags/push options / report-status-v2)、
<owner>/<repo>命名空间、sha1 与 sha256 仓库。 - bundle-uri:按周/日/小时切「包槽」,新克隆直接下发最新 full + 增量链,克隆字节彻底移出服务器,交给桶或 CDN。
- Git LFS:批量 API + 基本传输,对象放桶里,支持从上游 LFS 服务器读透(给导入的仓库用)。
- 附带 Web 浏览界面、JSON API + SDK、按仓库配置 push 策略、webhook 桥。
- 三种认证:
none(本机 loopback 测试)、token(静态 token)、oidc(接任意 OpenID Connect:Google/Entra/Okta/Keycloak/GitLab…)。
怎么用
一个桶 + 一份配置,然后就是跑起来:
# 1. 建桶 + 配置
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. 用——push 到一个新名字就自动建仓库
git -c http.extraHeader="Authorization: Bearer $WALGIT_TOKEN_ME" \
push https://git.example.com/acme/app.git main
就这么简单。同一桶上再加机器,它们服务同一批仓库、无需任何协调;全杀掉只是丢「热度」,丢不了数据(桶才是仓库)。
开发者侧设置交给一条幂等命令:
sh -c "$(curl -fsSL 'https://git.example.com/services/public/install.sh')"
它会把 token 写进只有用户能读的文件、装一个极小的 git credential helper(git ≥ 2.46),并开启 transfer.bundleURI。
本地先试单机全功能:just dev-store + ./target/release/walgit-server --config walgit.standalone.toml(自带自签 TLS + rustfs 本地对象存储)。
适合谁
- 受够自建 Git 复杂度的团队:不想伺候数据库/主从/集群,想把托管成本压到「只剩对象存储」;
- 仓库巨大、单机装不下的项目:靠对象存储 + bundle-uri 把克隆和 blob 移出服务器;
- 喜欢「一个二进制就是全部」这类工程哲学、想研究现代 Git 托管架构的开发者。
三点注意:不含 pull request / issues / CI——它专职做托管仓库,协作层还是得配 GitHub/GitLab/Forgejo 之类的平台(README 也明说了不覆盖这些);目标受众偏中大型自托管场景,不是替代 GitHub 全部功能;项目还很新(上线没几天),生产环境请先跑 just test 与故障注入模拟 cargo test -p walgit-server --test sim 再上。
项目信息
- GitHub:https://github.com/tobi/walgit
- 架构参考:https://cursor.com/blog/git-at-any-scale
- 报道(opensourceforu):https://www.opensourceforu.com/2026/08/shopify-ceo-builds-open-source-git-server-walgit-over-a-weekend/