dgit:基于 Durable Objects 的 Git 托管平台
摘要
dgit 是一个使用 Cloudflare Durable Objects 的 Git 服务器实现,提供去中心化、无服务器的 Git 托管服务,支持完整协议并配有 Web 界面。
查看缓存全文
缓存时间: 2026/08/19 02:26
littledivy/dgit 来源:https://github.com/littledivy/dgit
dgit
持久化的 git。dgit 是一个面向 Cloudflare Workers 以及通过 celld (https://celld.dev) 部署到自有设备的 Git 服务器。每个代码库都是一个持久对象:一个拥有独立命名和私有 SQLite 数据库的小型服务器,该数据库存储代码库的对象和引用,能通过标准 git 客户端使用 git 智能 HTTP 协议进行交互,并提供类 cgit 风格的 Web 界面。整个关键路径中无需源服务器、文件系统或 GitHub 的参与。无人操作的代码库几乎零开销,并且应用天然支持分片:一个热门代码库不会拖慢另一个。读取公开可访问;推送需进行身份验证;推送到一个不存在的名称会自动创建该代码库。
工作原理
dgit 使用 TypeScript 实现了 git:包括 pkt-line 帧协议、支持 ofs-delta 和 ref-delta 解包的 packfile 解析、基于流式 SHA-1 的 pack 生成、commit/tree/tag 编解码器以及 Myers 差异算法。唯一的依赖是用于 zlib 压缩的 pako。推送操作将数据流式传输到代码库的单元中,并直接存储为客户端发送的 packfile;一个索引映射每个对象 ID 到其对应的 pack、偏移量和 delta 基础,从而保留客户端的原始压缩而非重新计算。克隆操作遍历所请求引用的闭包,并将存储的压缩字节原样复制到传出的 pack 中。获取协商会排除客户端已有内容的闭包(在 shallow 边界处正确截断),因此增量获取只下载缺失部分。浅克隆(--depth、加深、--unshallow)、瘦包、带内进度报告、强制更新以及引用删除的行为都与使用任何标准 git 服务器时一致。
Web 界面是 cgit 的功能呈现:概览、引用列表、带搜索和按路径历史的提交日志、文件树、带语法高亮的 blob 浏览、blame 追溯、提交及任意范围的差异比较、可通过 git am 干净应用的 format-patch 输出、任意引用的 tar.gz 和 zip 快照、由 README 渲染的关于页面、atom 订阅源以及提交活动统计。代码库可附带描述、所有者信息、在索引页面上的分类区块,以及一个私有标志——该标志会隐藏代码库并要求每次读取都需提供推送令牌。
部署到 Cloudflare
npm install
npx wrangler deploy
npx wrangler secret put GIT_TOKEN # 推送密码
然后推送任意内容:
git remote add origin https://<你的子域>.workers.dev/myrepo.git
git push -u origin main
Worker 请求限制为 128MB 内存和五分钟 CPU 时间,因此超大型历史记录需要拆分为多次较小推送;日常的推送、克隆和获取操作则完全适用。对于拥有数百万对象的代码库,完整历史克隆可能超出 CPU 限制——但对该代码库进行浅克隆和增量获取则没问题。
在 celld 上自托管
celld 将相同的 Worker 部署到你自己的存储桶中,不受托管平台的请求限制。首先在 wrangler.celld.jsonc 中设置一个真实的 GIT_TOKEN 变量:
celld deploy wrangler.celld.jsonc --bucket s3://my-cells --endpoint https://...
CELLD_V8_HEAP_LIMIT_MB=4096
CELLD_LTX_DURABILITY_TIMEOUT_SECS=180
celld --bucket s3://my-cells --endpoint https://... \
--listen 0.0.0.0:8080 --internal-listen 10.0.0.1:8081 --advertise 10.0.0.1:8081
每个代码库的 SQLite 数据库会复制到存储桶中;节点是可替换的,被终止节点的代码库会以比特完全一致的方式恢复。堆内存和持久化超时参数为大型单单元数据接收提供了默认设置所不具备的空间。
运维操作
curl -X PUT -u x:$GIT_TOKEN -d '{"description":"...","section":"tools","private":false}' \
https://<你的子域>.workers.dev/myrepo/config
# 描述并归置代码库
curl -X POST -u x:$GIT_TOKEN https://<你的子域>.workers.dev/myrepo/gc
# 清理不可达对象
curl -X DELETE -u x:$GIT_TOKEN https://<你的子域>.workers.dev/myrepo
# 删除代码库
垃圾回收也会在强制更新或引用删除后,由持久对象的闹钟机制自动触发。GIT_TOKENS 可存放额外的逗号分隔令牌;MAX_PUSH_MB 限制单次推送大小。
参与贡献
请禁用拉取请求。请将 git format-patch 附件发送至 [email protected]。
相似文章
Celld:自托管的分布式 Durable Objects
Deno 的 celld 是一个开源守护进程,可在你自己的机器上运行 Cloudflare Workers 和 Durable Objects,每个对象使用 SQLite,并使用兼容 S3 的存储桶进行复制和协调,无需控制平面。
celld — Durable Objects, self-hosted
celld is a self-hosted, distributed server that runs Cloudflare Workers and Durable Objects code unchanged, using your own S3 bucket for storage and coordination. It claims significantly lower costs and sub-millisecond warm latencies at scale, with data stored in SQLite/LTX format.
我们应得的代码锻造平台
本文讨论了对GitHub可靠性日益增长的不满,并提出基于AT协议的去中心化Git锻造平台Tangled,作为一个结合了中心化便利性与用户数据所有权的有前途的替代方案。
Gitolite
Gitolite 是一个用于在中央服务器上托管 Git 仓库的工具,具有细粒度的访问控制和许多其他强大功能。
Show HN: Gitdot – 一个更好的 GitHub。开源、反 AI、用 Rust 编写
Gitdot 是一个开源的、反 AI 的、用 Rust 编写的 Git 托管平台,旨在作为 GitHub 的更好替代方案。