本期导读

上期我们聊完 SpaceX 收购落锤和 Grok 4.6,本期 Cursor 的新动作是上线 Origin 代码托管服务,正式从"AI 编程工具"切入"代码托管"赛道。这不是一次普通的功能迭代——背后有一篇来自 Vicent Martí 的深度技术长文,详细解释了他们的 Git 存储系统 Continuity 的设计思路。前 GitHub CTO 亲自动手写系统,细节密度极高,本期重点解读。

Origin 是什么:Cursor 自己做代码托管

一句话定义:Origin 是 Cursor 推出的 Git 代码托管服务,目前处于早期 Beta 阶段,面向所有付费用户开放。

从功能完整性看,Origin 目前的核心能力包括:

  • 代码仓库创建与管理:在 Cursor 内直接创建 Repo,通过 CLI 推送本地代码
  • GitHub 双向同步:连接 GitHub 账号后,可将已有 Repo 同步到 Origin,评论、PR 操作双向实时同步
  • PR 完整工作流:支持查看时间线、Commits、Checks、Diff,评论、审查、合并均可在一个界面内完成
  • Agent 深度集成:在任何 Repo 内直接唤起 Cursor Agent 提问或修改代码
  • App 生态:Vercel(预览部署)、Depot、Buildkite(CI)已接入

关键设计理念:GitHub 是 Origin 的"来源"而非竞争对手。Cursor 明确表示同步过来的 Repo 以 GitHub 为事实来源,用户可随时断开。这降低了迁移门槛——用户不需要做选择题,可以先用着,等功能成熟再决定是否迁移。

"Git at any scale":为什么自己做存储

真正有意思的是官方博客的技术细节。Cursor 没有用现成的代码托管方案,而是自己写了一套 Git 存储系统叫 Continuity(Cnt),由前 GitHub CTO Vicent Martí 亲自执笔解释设计动机。

问题定义:Git 分布式设计对服务端托管不友好

Linus 设计 Git 时假设所有副本平等——本地 clone 和服务器端 Repo 结构完全一样。这在 Linux Kernel 这种高度去中心化项目里是优势,但对需要中心化托管的服务商来说这是个麻烦:

Packfile 随机访问模式是瓶颈。 Git 把代码和元数据打包成 packfile,压缩存储。问题是 packfile 里对象的物理布局和 Git DAG 的逻辑结构完全无关——一个 commit 指向的 tree 和 parent 是通过 SHA 指针跳转的,packfile 里这些对象可能散落在任意位置。每次 clone、fetch、log 操作都要顺着 DAG 做随机读,在网络文件系统上这几乎是死穴。

GitHub 历史上踩过大量坑:NFS 性能差到不可用,GFS 和 DRBD(块复制)勉强能用但运维成本极高。最终 GitHub 走向了 Spokes 架构——应用层 replication,在 packfile 级别做三副本同步,用三阶段提交(3PC)保证一致性。这个方案 2013 年成型,至今仍是行业标准。

Spokes 的局限性:3PC 的天花板

但 Spokes 有结构性缺陷,Cursor 团队(由 Vicent Martí 主导)认为有两个问题在 2026 年变得无法忍受:

第一,水平扩展受制于最慢节点。 3PC 是同步共识算法,每次 push 的延迟由最慢的那个节点决定。节点越多越慢,push 吞吐反而下降。这与现代 monorepo 的需求直接冲突——大仓库需要大量副本来分散 CI 流量,但 Spokes 的扩展方向是反的。

第二,机器成了"宠物"而非"牛群"。 Spokes 的 Repo 磁盘是事实来源,每个副本都必须保持健康。路由表存在外部数据库里,Repo 损坏需要在分钟级别内发现并修复——否则三副本里坏两个就失去 quorum,无法接受 push。这套机制在 GitHub 规模运维了 13 年,经验丰富但复杂度不低。

Continuity 的核心思路:WAL-first,存储在 S3

Cursor 的解法是把 Write-Ahead Log(WAL)放在 S3,作为所有副本的事实来源。本地 NVMe 盘上的 Git Repo 变成"热缓存",而非数据源。

具体机制:

  • Push 时,先将 packfile 和 WAL entry 同时写入 S3,不等确认不 ack
  • 只有 WAL 写入成功后,才在本地 Repo 执行 reference transaction,更新 WAL index pointer
  • 这强制所有 push 是线性可排序的(linearizable)
  • 读取时,任意副本都可以服务 fetch/clone 请求,因为 S3 上的 WAL 是唯一真相来源

一致性保证:UDP gossip + S3 conditional GET

"去中心化复制"听起来很美好,但如何确保各副本最终一致?

Cursor 的方案是:每个副本通过 UDP gossip 广播 push 元数据,收到后主动从 S3 拉取。但关键在于读取时的 S3 conditional GET——副本在服务 fetch 前,发一个带 ETag 的 GET 请求,S3 返回 304(未修改)说明本地已同步,返回 200 则说明有落后,需要 catch-up 再服务。这个检查平均 <10ms,开销极低。

这里的技术品味值得注意:用不可靠传输(UDP)做 gossip,读取时才做最终一致性验证,最终保证的是降级时始终正确,正常时始终快速。这是一种在 CAP 理论中偏向 C(一致性)但不忘保留性能的工程哲学。

与 Azure DevOps 的区别

Cursor 特别提到 Azure DevOps 也用 blob 存储 packfile,但 Azure 把 references 存在 SQL Server 里——这在大事务场景下有优势,但多了一层运维依赖。Cursor 的方案是 references 也存在 WAL 里,不需要外部关系型数据库,减少了运维复杂度。

技术视角:为什么这不只是"又一个 GitHub 竞品"

分析一个产品如果只停留在功能对比,会错过真正重要的东西。Origin 的出现有更深层的逻辑:

Agent 工作流天然对 Repo 数量和生命周期有非线性需求。 当 AI Agent 帮助开发者工作时,它们会为每个子任务创建 Repo、生成代码、跑 CI、合并 PR。一个成熟开发者在真实场景下产生的 Repo 数量可能是传统开发者的 5-10 倍,而且大量 Repo 生命周期很短(临时实验、废弃分支)。GitHub 的 Spokes 架构对每个 Repo 固定三副本,闲置 Repo 也占用资源。Cursor 的 Continuity 可以让空闲 Repo 只保留 S3 上的 WAL,本地零副本,需要时再 materialise——这在 Agent 场景下更经济。

Origin 是 AI 编程工具的数据枢纽。 Cursor 的护城河不只是模型能力,而是用户代码的上下文。当 Agent 深度集成到一个代码托管平台时,Cursor 拥有的数据密度(代码结构、PR 历史、CI 行为、Agent 工作轨迹)远超任何一个独立的编程工具或托管平台。这种数据优势可以训练出更理解代码库的模型,或者至少让模型推理时拥有更丰富的上下文。

本期小结

事件重要性核心看点
Origin 代码托管上线⭐⭐⭐⭐⭐Cursor 切入代码托管赛道,GitHub 双向同步
"Git at any scale"⭐⭐⭐⭐⭐Vicent Martí 详解 Continuity,WAL-first 存储设计
Agent-Repo 深度集成⭐⭐⭐⭐在托管平台内直接召唤 Agent,改变工作流

Origin 的出现意味着 Cursor 的定位正在从"AI 编程 IDE"向"AI 原生开发平台"迁移。代码托管是第一步,背后是对 Agent 工作流的系统性支撑。下期继续观察 Origin 的 Beta 反馈和功能完善进度。