9月18日,一篇《扒一扒ZCode静默上传全量Git历史的骚操作》在国内开发者圈刷了屏。起因很偶然:开发者 ferstar 清理磁盘,发现 `~/.zcode` 占了七百多 MB,其中 `v2/checkpoints` 里躺着一个 313MB 的 `.enc` 加密文件——状态文件显示,这是某个商业项目的全量工作区快照,已经"上传失败 564 次",还在本地排队重试。知乎
一天之内,知乎主问题浏览量冲到 130 万+,同款问题挂了 4 个;微博 #智谱ZCode致歉并开源# 话题下,转发最广的一条就是智谱 17:43 发在用户群里的致歉声明全文;linux.do、CSDN、开源中国接连跟进,至少四位开发者在自己机器上做了独立取证,结论彼此能对上。智谱傍晚发布说明:问题源于"代码库索引"功能,上线初期默认开启、现已修复,承诺近期开源 ZCode、邀请第三方审查,补偿全体用户一次周额度重置。知乎微博

但取证党们最在意的不是道歉,是账没对上的部分。这篇文章把两边口径摆在一起,再给你一份今晚就能做的排查清单。
包里到底装了什么:三份独立取证的交叉账
解开客户端的 app.asar 后,链路被还原得很完整:客户端向 `zcode.z.ai` 的 `/api/v1/snapshot/upload-credential` 申请凭证,服务端返回快照编号、RSA 公钥和阿里云 OSS 的表单签名;本地把工作区打成 tar.gz、加密、直传 OSS,OSS 再回调通知智谱后端。
三份互相独立的样本,包了什么:
ferstar 的清单共 42,411 个文件:`.git/lfs` 196.1MB(56.8%)、`.git/objects` 102.2MB(29.6%),八成六的体积是 Git 仓库史,源码加文档只占 13.4%;
开发者 Gavin 在 Windows v3.11.2 上解剖:755 个文件的 manifest 里 557 个在 `.git/` 下,剩下 198 个是整个工作区源码;`state.json` 里 `lastAcceptedManifestHash` 非空、pending 目录为空——2026-09-11 00:39:35 那次是真上传成功了,不是只打包;
陈骁装 ZCode 才两天:9月18日中午后台仍在他仓库里生成快照、签发凭证,一次 682MB 的包因太大上传失败 4 次躺在本地,而他建的一个轻量子工作区"任务跑完就被顺手打包发走",已写入成功标记。知乎
包里还有两样比源码更敏感的东西:跨工作区的全局配置(`mcp.json`、`settings.behavior.json`,里面常放着各服务的接入令牌、技能与子代理配置),以及触发这次快照的那条 prompt 原文。知乎

三个被这事件砸碎的直觉
第一,`.gitignore` 保的是现在,漏的是历史。 按取证结果,打包遵循 gitignore 规则——你 ignore 掉的当前文件不进包;但 `.git/objects` 里存着每一个历史版本的完整内容:删掉的配置文件、换下来还没作废的旧密钥、reflog 里没推送过的分支名、`.git/config` 里的内部 GitLab 域名。Git 历史一旦被整包上传,“删掉了"从来等于"还在”。
第二,"我代码反正推过 GitHub,传就传了"不成立。 Gavin 中招的是没有任何 remote 的纯本地仓库,完整历史全网只有他机器上一份——取证之后,世界上多了第二份,在能解密的 OSS 里。
第三,"加密了"防的是第三方,不是服务方。 文件用随机 AES 密钥加密,密钥被服务端下发的 RSA 公钥包一层,私钥只在云端。ferstar 拿本机所有私钥去解自己盘上那 313MB,全部失败。数据在你机器上生成、在你机器上排队,但连"核对里面装了什么"都做不到——备份的可用性从落盘那一刻起就不归你。
官方口径和取证口径,哪里还没对上
官方说明里立得住的部分:快照功能有正当理由(检查点恢复、历史回退、Repo Wiki),且官方 Repo Wiki 文档确实承诺 Wiki 结果只存本机、发给模型的上下文过滤 `.git`。但开发者们指出,"发给模型的那一路"和"快照直传 OSS 的那一路"是两条链路、两套口径,范围明显不同,目前只有本地那一路有公开承诺。知乎
对不上的有三处:
开关无效。issue #707 提交者实测把 `repoSnapshotIndexingEnabled` 关成 false,上传痕迹照样出现;Gavin 还原的代码里,上传链路从头到尾没读过这个开关——他机器上它一直是关闭状态。设置页里这个开关的文案是"自动索引文件数少于 50,000 的新文件夹",只字未提上传和云端。知乎
不用"仓库理解"功能,只是正常聊天也可能上传。Gavin 机器上那次实锤,触发的是一个再普通不过的技术选型讨论;陈骁 9 月 18 日中午还在持续生成快照,而官方"已修复"的说法发布在当天傍晚——修复的具体口径是什么、打包是否停了,还没有能直接复核的公开版本。
"云端生成后立即销毁"无法被用户验证。私钥只在云端,没有删除渠道,没有回执。此外补偿方案"一次周额度重置"也被订阅向用户吐槽:只是登录没订阅、走 BYOK 接自家 API 的用户,等于白担一场。微博
现行隐私政策 6 月 15 日更新,收集范围列的是"对话中提交的文本和文件",整包工作区快照、Git 历史在政策里找不到对应条目;官方 FAQ 十五条问答,没有一条提快照和数据去向。

也要抄一句 ferstar 的免责原话:这是特定环境下的调查,不构成对官方行为的最终认定。所有样本都是单机取证,欢迎按下面的方法在自己机器上复核。
今晚的排查:三步,十分钟
打开 `~/.zcode/v2/checkpoints/<工作区哈希>/`,看两样东西:`state.json` 里 `lastAcceptedManifestHash` 是否非空(非空=至少成功传过一次)、`failureCount` 是多少(重试队列里压了多少次);再看 `manifests/` 清单里有没有 `.git/objects` 条目。不同版本行为有差异——有用户的 manifest 里零条 `.git` 路径,别用别人的结论代替自己机器上的证据。知乎
中招了先转钥匙:把 `mcp.json` 等全局配置里出现过的服务令牌全部轮换;把仓库历史里删除过、替换过的密钥一律按已泄露处理;公司项目、客户代码按你们的合规流程上报留证,截图保存 `state.json` 和清单。知乎
临时止损:macOS 清空 checkpoints 目录后 `chflags uchg`,Linux 用 `sudo chattr +i` 锁住目录——代价是回滚、时间线功能失效,日常对话和补全不受影响;退出登录也能停掉上传(原帖分析上传只在登录态发生),代价是工具没法用。Windows 暂时没有干净等价物,只能盯官方修复版本+定期用第 1 步自查。

风波之后:开源只是入场券
这事件的连带效应是"开源"成了国产 AI 编程客户端的事实标准:MiniMax Code CLI 当天开源,Kimi Code、DeepSeek Harness 本来就在开源阵营,ZCode 也承诺近期开源。高权限 Agent 客户端可读可审计,方向当然是对的——但开源客户端只能证明"上传代码是怎么写的",证明不了"云端数据删没删"。微博
issue #709 里开发者提的五条诉求,可以当成一条合格线:数据流向要披露、开关默认关闭且真的有效、用户能解密自己的数据、修订隐私政策、提供删除渠道。往后评估任何一个要读全仓的 AI 编程工具(不止 ZCode,Cursor、Claude Code、Trae 都适用),先问三个问题:这个功能到底需不需要把仓库或历史发到云端?本地有没有开关、有没有人实测有效?传上去之后我能不能解密、能不能删。小红书那篇《反编译了我天天用的AI编程App,后背发凉》说得直白:本地模型不等于本地数据,模型层和客户端层是两个独立的风险面。小红书
这场风波没推翻任何功能,但它重写了一条默认前提:在 AI 编程工具里,"留在本地"不再是可以信任的假设,而是要亲自排查的结论。接下来值得盯的信号:ZCode 开源的实际时间表、隐私政策是否补上快照条款、删除渠道是否出现。查完自己机器那一下,欢迎来评论区报个数。