程式助理要讀程式碼,才能補全和改錯誤訊息。你點開一個儲存庫,心裡預設交出的是目前工作區裡、這次任務用得上的那幾份檔案。工作區根目錄的 .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。私鑰從頭到尾只在雲端。本機那份幾百 MB 的 .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。LINE、Slack 或工單裡只貼井字號前面的
s.html?id=…,金鑰用電話或當面說。開啟即用,無需註冊。接收方只有編號時應看到連結不完整;兩半湊齊才能解密。讀完後覆蓋剪貼簿,不要把帶#的位址寫進儲存庫,也不要把結果頁整段貼進任何助理對話框。
公司儲存庫再加半步:問清楚助理預設開啟哪些根目錄、能不能把金鑰目錄排除在工作區外、歷史快照有沒有企業端的刪除回執。MyPassGen 不會代你判斷某家雲端有沒有另存副本,核對結果以你剛才那幾扇視窗和 Git 紀錄為準。
必須交接金鑰時怎麼拆
一對一、對方能立刻打開時,不要把密碼寫進會進 Git、會進助理工作區、會長在物件庫裡的檔案。在本機產生密碼,再做成閱後即焚。建立焚鏈時瀏覽器使用 AES-256-GCM 加密,明文上限 32 KB,閱讀次數預設 1、上限 10,過期可選 1 小時、24 小時、7 天,或只按次數、不設 TTL。伺服器端只暫存密文。金鑰放在 URL 的 # 後面,存取紀錄和 Referer 裡看不到這一段;儲存庫和助理對話框看得到,所以不要把完整連結寫進提交。
必須讓儲存庫或工單裡留個入口時,把通道拆開。檔案只發負責人和編號,以及「金鑰走電話」這一句。電話、當面或另一個即時訊息帳號只發 # 後面那一截。沒有兩半就解不開。這是用法,不是產品預設拆分;建立頁產生的仍是一條完整連結,方便一對一交接。會產生預覽卡片的頻道,先用測試連結看預覽會不會計數;台灣常用的 LINE 也用同一套核對,見把閱後即焚連結貼到 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 的金鑰當成需要輪替的材料。
建立和閱讀要註冊嗎?刪錯了有沒有客服能找回?
不需要註冊。建立與閱讀都對訪客公開。密文按次數或過期焚毀之後,沒有伺服器端明文備份,也沒有客服信箱可以找回。發錯通道就重新產生密碼、另建一條連結,不要反覆重新整理同一條碰運氣,也不要把結果頁寫進儲存庫補發。