编程助手要读代码,才能补全和改报错。你点开一个仓库,心里默认交出的是当前工作区里、这次任务用得上的那几份文件。工作区根目录的 .env 如果已经写进 .gitignore,很多人会当成「助手看不见、云端更看不见」。2026 年 9 月 18 日,开发者 ferstar 把另一层写清楚了:智谱官方桌面端 ZCode 在登录之后,会在本机打出工作区快照;清单里占体积大头的,不是 src/,而是完整的 .git。
上一篇写过把口令贴进 ChatGPT 或 Gemini 之前,哪些字必须先打码:那是你主动粘贴的一段文字。本文换问题:你没有把 .env 贴进对话框,工作区快照里的 Git 对象库、LFS 缓存和 reflog,还会不会把早已删掉的密钥一并带走。密钥如果改走阅后即焚,形态仍是 s.html?id=…#…,创建与阅读都不用注册。MyPassGen 的工具打开即用。下面不拆客户端、不讲怎么拦别人的上传,只对照 ferstar 2026 年 9 月 18 日复盘和同日 IT之家转述的官方说明已经写下的数字,以及你能在自己电脑上打开的 checkpoints 目录。
先分清两件事
「我已经升级到不再上传的版本」挡住的是下一次打包。已经打好、已经离开本机、官方说「Wiki 生成后立即销毁」的那些快照,外部没法进服务端核对备份是否还在、私钥还在谁手里。先看本机有没有待传的 .enc,再决定哪些曾经进过 Git 的口令必须轮换。不要用改客户端版本代替「这台机器上还留不留下快照、仓库历史里还读不读得出测试密钥」。
打开仓库,不等于只交了当前这一份
对话里贴一段函数,模型吃到的是你选中的上下文。工作区快照是另一条路:客户端按打开的仓库做打包,范围可以大于「这一次提问用得上的文件」。ferstar 写的清单把体积拆开之后,.git/lfs/、.git/objects/、.git/logs/ 加在一起约占 86.6%,其余源码和文档大约 13.4%。也就是说,就算当前目录已经删掉 .env,对象库里旧提交的 blob 仍可能跟着走。
这和「网页有没有把你正在生成的口令当业务数据发出」不是同一条路。MyPassGen 的生成页可以在浏览器 Network 里核对没有把明文当业务数据发出;桌面助手打快照,走的是它自己的本机目录和它自己的出站连接。你在工作区里 git rm 掉的文件,对 Git 来说常常只是「当前树没有」,不是「历史里从未出现」。把未打码的密钥写进过提交,和把口令写进邮件正文是同一类问题:接收方看见的是你曾经主动留下的副本,见把临时口令写进邮件正文,已发送、转发和手机预览还会留下什么。
还有一层容易混:.gitignore 挡住的是「以后不要再跟踪这个路径」,挡不住「这个路径曾经被提交过」。助手若只读工作区当前文件,忽略规则还有用;快照若把 .git 整目录打进去,忽略规则帮不上忙。未推送到远端的本地分支、reflog 里的操作记录、.git/config 里的内部仓库地址,都属于「当前编辑器标签页看不见、对象库里还在」的那一类。
9 月 18 日写进复盘和说明的数字
ferstar 写,起点是本机 ~/.zcode 占了七百多 MB。其中 v2/checkpoints/ 约 303 MB,里面有一份约 313 MB 的 .enc,状态文件记下工作区打包前约 345 MB、加密后 313070842 字节,类型为 baseline,failureCount 为 564。这份商业项目快照卡在本地 pending,复盘写明它没有传成功。另有一个很小的公开仓库:538 个文件,压缩加密后约 15 KB,状态是服务端已接收。所以「有没有真传出去」——至少这一次,小仓传出去了。
同一份商业项目的文件清单统计:共 42411 个文件;.git/lfs/ 约 196.1 MB(56.8%),.git/objects/ 约 102.2 MB(29.6%),.git/logs/ 约 0.6 MB(0.2%)。社区另有复现写过:ZCode 3.12.3 上,一个项目快照约 748 MiB,其中 .git 约占 98.91%。捕获触发点,复盘点名了提问前的 captureBeforePrompt,以及任务结束时的 repo-wiki-update;单个活跃会话日志里,最多出现过 62 次快照捕获。
官方说明在 9 月 18 日 17:44 发出,IT之家等于当晚转述。要点是:问题出在「代码库索引」,用来做本地索引、会话检查点回滚和 Repo Wiki;Repo Wiki 在云端生成页面时「可能」触发仓库数据上传;Wiki 生成后,相关上传数据会立即销毁、不会保存;上线初期默认开启,部分用户受影响,问题「已经修复」;近期开源 ZCode,并引入第三方审查;全体用户额外一次周额度重置。官方对「存在上传行为」没有否认。存疑的是上传范围、当时关不关得掉,以及「立即销毁」如何从外面核对。9 月 20 日,InfoQ 转述太原承明科技向北京智谱华章发出函件,要求说明删除、流向、日志和责任主体——那是企业侧的追问,不是你可以在本机点开的销毁证明。
.git 才是大头:已删密钥还在对象库里
当前工作区里没有 .env,只证明现在检出的那棵树没有这个路径。Git 对象库按内容存 blob:某次提交写过 DATABASE_URL= 或 AWS_SECRET_ACCESS_KEY=,后来你改文件、再提交、甚至从当前分支删掉,旧 blob 常常还在 .git/objects 里,直到 gc 真正丢掉它。LFS 缓存则可能留下历史大文件。reflog 记下你在这台机器上挪过哪些分支。把这三样打进快照,云端拿到的就不是「此刻编辑器里的那一屏」,而是这份仓库在这台机器上积下来的历史。
复盘还写过:工作区过滤会排除一部分密钥文件,但 .git 仍进入打包。这句话值得单独停一下。你今天把 .env 移出仓库、只留 .env.example,当前树看起来干净;对象库里去年那次误提交,过滤器若只看工作区路径,就不会把它拿掉。内部 GitLab 域名写在 .git/config,本地还没推送的功能分支名写在 refs 和 reflog,这些都不是「我已经 gitignore 了」能收回的。
这和「密码哈希泄露不等于别人已经读出明文」可以对照,但不能互相代替。哈希是单向存法,仍要改密。Git 历史里的密钥经常就是明文。本机对照常见弱口令名单,只能证明命中了公开列表,不能证明某次快照有没有带走你的旧提交,见本机对照泄露名单,和全网密码查询差在哪。该轮换的是曾经写进提交的那一批,不是「我现在工作区是干净的」这一眼。
打成密文,不等于只有你能解
复盘还原的出站形态是:客户端向 zcode.z.ai 申请快照上传凭证,拿到对象键、大小限制和一把 RSA 公钥;本机把工作区打成 tar.gz,用 AES-256-CTR 加密,再用这把公钥包裹对称密钥,把 tar.gz.enc 直传到阿里云 OSS。私钥从头到尾只在云端。本机那份几百兆的 .enc,你打不开,客户端也打不开。算法名字写了 AES-256,解决的是「路上和桶里不是明文文件」,没有把解密权交给你。
这和「网盘页写已加密」是同一类分界。服务商代管密钥时,存储方仍能打开;本机用你持有的口令先加密,对面只看到密文。差别不在「有没有出现 AES 四个字母」,而在私钥或口令在谁手里。MyPassGen 的文件加密盒在浏览器里用 AES-256-GCM 做流式加密,单文件不超过 5 GB,输出 .lock / .enc,打开即用;口令由你另发,文件不作为业务数据上传。ZCode 那次快照的信封密钥由服务端下发公钥、自持私钥,目标正好相反:确保服务端能解。见把文件丢进网盘前,谁拿得到明文、口令该走哪条路。
官方写 Wiki 生成后立即销毁、不会保存。销毁如果发生在服务端,你在自己的电脑上核对不了备份、对象存储版本和私钥副本。ferstar 对照 3.14.0 时写:上传链路代码已从客户端去掉,upload-credential 返回 404,本地只留 checkpoint。这能证明「这台新客户端不再走那条申请凭证的路」,不能证明「已经接收入库的小仓快照已经从所有副本里物理删除」。把「加密过」读成「只有我能看」,会漏掉真正要做的轮换。
关掉设置,不等于停掉打包
复盘把两个开关和代码路径对过:optimizeAgentExperienceEnabled(优化体验)管的是要不要用数据训练,关掉以后快照仍打;repoSnapshotIndexingEnabled(仓库快照索引)管的是服务端拿到快照后要不要建索引,关掉以后本机打包仍走。3.12.3 上,负责捕获和上传的逻辑在登录拿到 JWT 之后就会起来,界面里没有单独的「禁止打包上传」。官方说明没有列出一个用户能勾掉、并且能当场验证已停止出站的开关,只说功能初期默认开启、问题已经修复。
因此,「我没开 Repo Wiki」和「我关掉了训练」都不能当成 3.12.3 的免责声明。以你本机 checkpoints 目录当时有没有新的 .enc、状态是 pending 还是已接收为准。升级到复盘所称的 3.14.0 之后,应再看同一目录:还会不会长出新的待传包,申请凭证的地址还回不返回成功。客户端会热更新,版本号和目录是你能反复看的两样东西,新闻标题不是。
9 月 18 日当天存过的官方隐私政策快照,页面仍标注更新于 2026 年 6 月 15 日。政策写收集对话中提交的文本、文件和代码——这是助手调模型的常规范围。复盘指出,当时通篇没有写整仓快照或把完整 Git 历史上云。政策句子和本机清单对不上时,以清单和状态文件为准,不要用「我同意过隐私政策」倒推「所以只传了对话框里那一段」。
对照表:当前文件、Git 历史、对话各留下什么
同一条曾经写进仓库的测试密钥,至少能分成四条「谁还能再读到」的路径。差别不在助手品牌,而在副本被复制到了哪里、解密权在谁手里。
| 你做了什么 | 本机还留下什么 | 对端官方或复盘已点名的残留 |
|---|---|---|
| 只打开仓库,不登录助手 | 工作区和 .git |
无(快照链路还没拿到登录态) |
登录 3.12.3,当前树已删 .env |
对象库里旧 blob 仍在 | 快照清单仍可含完整 .git;小仓有过服务端已接收的记录 |
| 关掉训练 / 快照索引开关 | 与对象库无关 | 3.12.3 复盘:本机仍打包;开关不覆盖上传 |
| 升级到不再上传的版本,不看 checkpoints | 旧 .enc 和状态文件可能还在 |
下一次出站停了;已接收快照能否销毁,外部无法核对 |
| 密钥从未进 Git,交接走焚链且通道拆开 | 测试文件可删 | 快照搜不到完整凭证;对半拼齐才能解密 |
第五行和前四行不要混。把完整 s.html?id=…#… 写进仓库再打开助手,历史和快照仍可能拿到整段凭证,只是托管密文的服务看不到密钥。编号和密钥拆开,全文搜索才搜不到能打开的完整链接。完整链接仍要当口令本身保管。本机先加密再同步的是文件;Git 对象库一旦提交过明文,后补一个 .lock 不会把旧 blob 擦掉。
当场核对
下面这组步骤不依赖任何品牌承诺。全程使用不会登录真实工作账号、不会指向公司仓库的测试口令和一次性仓库,例如在空目录里写一行 orange-lake-7 再提交、再删。不要拿正在使用的主密码、生产 API 密钥或真实焚链练手。
- 看 ZCode 关于页或安装包上的版本号。复盘把 3.12.3 写成问题版本、3.14.0 写成上传链路已拆除。以你此刻读到的数字为准,不要用群公告代替这一眼。
- 打开本机数据根目录里的
v2/checkpoints(macOS / Linux 常见为~/.zcode/v2/checkpoints,Windows 以你安装后的用户目录为准)。有没有.enc,旁边有没有状态 JSON。能打开的字段只看:workspacePath是不是你以为没打开过的项目、encryptedSizeBytes、failureCount、kind。路径对得上,说明这台机器为那个仓库打过包;failureCount很大只说明当时没传成,不证明从来没有成功过别的仓。 - 另建一个空测试仓库,提交一句测试口令,再从当前树删掉。用
git log -p或git log --all --full-history -- 文件名看旧提交还在不在。还在,说明「我已经删了」救不了对象库。这是 Git 自己的行为,与任何助手无关;快照如果把.git打进去,读到的就是这一层。 - 若测试仓曾经被 3.12.3 打开过:回到 checkpoints,看有没有对应该路径的新包。升级之后再观察一段时间,还会不会长出新的待传
.enc。本机文件是你能反复看的证据,不需要、也不应当去拆别人的客户端。 - 凡是真实仓库里曾经提交过的口令、令牌、内网地址,按「已经离开过这台机器」处理:在原服务上轮换,并换一条新的随机口令。MyPassGen 的密码生成器随机模式 6–128 位,默认 16,低于 8 位会提示较弱;打开即用,生成结果不作为业务数据上传。复用过的口令,用密码检测在本机对照常见弱口令名单——它能证明命中公开列表,不能证明某次快照的范围。
- 另建一条 MyPassGen 阅后即焚链接,写入同一句测试口令,过期选 24 小时,阅读次数保持 1。聊天或工单里只贴井号前面的
s.html?id=…,密钥用电话或当面说。打开即用,无需注册。接收方只有编号时应看到链接不完整;两半凑齐才能解密。读完后覆盖剪贴板,不要把带#的地址写进仓库,也不要把结果页整段贴进任何助手对话框。
公司仓库再加半步:问清楚助手默认打开哪些根目录、能不能把密钥目录排除在工作区外、历史快照有没有企业侧的删除回执。MyPassGen 不会代你判断某家云端有没有另存副本,核对结果以你刚才那几扇窗口和 Git 日志为准。
必须交接密钥时怎么拆
一对一、对方能立刻打开时,不要把口令写进会进 Git、会进助手工作区、会长在对象库里的文件。在本机生成口令,再做成阅后即焚。创建焚链时浏览器用 AES-256-GCM 加密,明文上限 32 KB,阅读次数默认 1、上限 10,过期可选 1 小时、24 小时、7 天,或只按次数、不设 TTL。服务端只暂存密文。密钥放在 URL 的 # 后面,访问日志和 Referer 里看不到这一段;仓库和助手对话框看得到,所以不要把完整链接写进提交。
必须让仓库或工单里留个入口时,把通道拆开。文件只发负责人和编号,以及「密钥走电话」这一句。电话、当面或另一个即时消息账号只发 # 后面那一截。没有两半就解不开。这是用法,不是产品默认拆分;创建页生成的仍是一条完整链接,方便一对一交接。会生成预览卡片的频道,先用测试链接看预览会不会计数,见把阅后即焚链接发到 Slack 或微信,预览会不会先烧掉一次。报错和配置摘录先走隐私清洗打码,再决定还要不要贴进助手。
超过 32 KB 的密钥包或导出表,不要硬塞进焚链,走文件加密盒:浏览器里 AES-256-GCM 流式加密,单文件不超过 5 GB,输出 .lock / .enc,口令另发。本机先加密再同步,对面只看到密文。把未打码的 .env 推进 Git,和把未加密的证书包推进网盘是同一类问题:证明「这是密钥」的那一份,离开了你以为已经删掉的工作区。浏览器里做加密时怎么当场核对明文没有作为业务数据上传,见浏览器里做加密,怎么当场核对明文没有上传。
做完「checkpoints 里有没有对应该路径的 .enc」「git log 还能不能读出测试口令」「只升级客户端会不会清掉旧快照」这三次核对,你就已经能回答本文的问题:当前树删掉 .env,不等于对象库和曾经打出的快照一起空了。官方修复的是他们能改的客户端链路;已经接收入库的包,以及你仓库里旧提交的明文,不是升一次版本就会变空的。本机目录和 Git 日志适合当核对入口,不适合假设「我没把密钥贴进对话框就结束了」。
常见问题
我已经升级,旧快照是不是也没了?
不是同一件事。新版本挡住的是下一次申请凭证和直传。本机旧 .enc、状态文件,以及官方所称「生成后立即销毁」的云端副本,不在「升级」这一动作里。以你现在 checkpoints 还在不在、真实密钥有没有轮换为准。
工作区已经 gitignore 了 .env,还用轮换吗?
看历史,不看当前树。忽略规则只挡住以后的跟踪。旧提交里出现过明文,就按已经复制过处理。在测试仓用 git log 核对一遍,比相信过滤器更直接。
快照是加密的,能不能当没泄露?
不能。复盘写明私钥只在云端,本机密文你自己解不开。加密防止的是「桶里躺着一份明文 tar」,不是「只有仓库主人能读」。无法从外部证明销毁,就把曾经进过 Git 的密钥当成需要轮换的材料。
创建和阅读要注册吗?删错了有没有客服能找回?
不需要注册。创建与阅读都对访客公开。密文按次数或过期焚毁之后,没有服务端明文备份,也没有客服邮箱可以找回。发错通道就重新生成口令、另建一条链接,不要反复刷新同一条碰运气,也不要把结果页写进仓库补发。