用 Claude Code、Codex 這類 AI 寫程式時,AI 常會把整個專案複製一份到旁邊做事,這份副本叫「工作樹」。事情做完,副本不會自己消失。我看到別人的硬碟被吃掉 585GB,回頭查自己的電腦:211 份、48GB。這篇記錄我怎麼判斷哪些能清、怎麼清才救得回來,以及清完之後怎麼讓它每個月自己被檢查一次,最後附一段可以直接貼給 AI 的盤點提示詞。
- 用 AI 做網站或小工具一陣子了,某天跳出「硬碟空間不足」,卻找不到是什麼東西佔掉的
- 聽過「工作樹」或 worktree,知道 AI 會開,但不確定做完能不能刪、刪了會不會掉東西
- 同時讓兩個以上的 AI 改同一個專案,想知道副本越堆越多時要怎麼收
- 判斷一份工作樹能不能清的五個檢查點,以及每一點在防什麼
- 一個「搬垃圾桶、不刪分支」的清法,清錯了也救得回來
- 一段可以直接貼給 AI 的盤點提示詞,先列清單、你點頭才動手
我這台電腦有 211 份工作樹,佔了 48GB
起點是看到有人說,硬碟被 AI 開的工作樹吃掉 585GB。
我請 AI 先盤點,不動任何東西。它把我放程式專案的兩個資料夾掃過一輪,結果如下:
| 專案 | 工作樹份數 | 佔用空間 |
|---|---|---|
| 知識官網(就是你正在看的這個網站) | 165 | 41.0GB |
| 官網的發布工作台 | 12 | 3.5GB |
| persona 專案 | 16 | 3.4GB |
| 其他 6 個專案 | 18 | 不到 0.2GB |
| 合計 | 211 | 48.1GB |
我這邊官網一份大約 0.25 到 0.3GB,單份不大,是份數多,原因在下一段。
為什麼工作樹會越堆越多:一篇文章開一份,做完沒人收
工作樹的用途很單純:兩個 AI 同時改同一個專案時,各自在自己的副本裡做,就不會互相蓋掉檔案。git 會記得每一份副本對應哪一條分支,做完再合併回主線。
我的官網從 2026 年 8 月 19 日起改成「一篇文章一張桌子」:每開一篇新文章,就用腳本開一份工作樹,這篇文章的所有施工都在那份副本裡做。這個做法解決了兩個 AI 搶同一個資料夾的問題,副作用是文章上線之後,那張桌子沒有人收。兩個半月下來,官網累積了 165 張桌子。
- 兩個 AI 同時改一個網站,為什麼會打架?:當初為什麼改成一篇文章一份工作樹,這篇是起點。
哪些工作樹可以清:五個檢查點都過才算
工作樹裡最怕的是「做好的東西只在這份副本裡」。所以判斷能不能清,看的是裡面還有沒有別處找不到的東西:
「怎麼查」那一欄看不懂沒關係,文末的提示詞會叫 AI 替你查,你只要看懂第三欄每一點在防什麼。
| 檢查點 | 怎麼查 | 在防什麼 |
|---|---|---|
| 1 沒有沒存的改動 | git status --porcelain 是空的 | 改到一半還沒存進 git 的檔案 |
| 2 沒有被 gitignore 的檔案 | git ls-files -o -i --exclude-standard --directory 排除 node_modules 這類可以重新安裝的資料夾之後是空的 | .env、本機資料庫這類 git 刻意不管的檔案,第 1 點看不到它們 |
| 3 最新進度已經推上遠端 | 先 git fetch --prune,再看 git branch -r --contains HEAD 有沒有結果 | 只存在這台電腦上的 commit |
| 4 沒被鎖住 | git worktree list --porcelain 沒有 locked | 有人刻意標記「這份先別動」 |
| 5 最近 7 天沒動過 | 看副本裡所有檔案的最後修改時間 | 另一個 AI 對話正在用這份副本 |
第 3 點要先 fetch --prune,是因為電腦上記的遠端分支可能是舊的。遠端已經刪掉的分支,本機紀錄還在,就會被誤判成「已經推上去了」。
git status 看不到被 gitignore 的檔案,像 .env 這種清掉就救不回來。那時我已經清完了,所以回頭把垃圾桶裡的副本全部掃一遍:被 gitignore 的只有 1 個部署設定資料夾 .vercel/,裡面是專案編號,沒有金鑰。這次運氣好,檢查點已經補進盤點腳本。怎麼清才救得回來:搬垃圾桶,不刪分支
五個檢查點都過的有 122 份,約 27.9GB;另外 5 份是資料夾早就不見、只剩 git 紀錄的。我的清法有三個原則:
- 先試 2 份再放大:搬完確認 git 紀錄消失、分支還在、資料夾在垃圾桶,才清剩下的。
- 整個資料夾搬到垃圾桶,不用刪除指令:清錯了還拿得回來。搬之前每一份再重驗一次第 1、3 點,避免盤點到動手之間有人改過(審查時另一家 AI 建議第 2、4 點也要重驗,提示詞裡已經補上)。垃圾桶裡另開一個帶日期時間的資料夾,按專案分開放,同名的副本才不會互相蓋掉。
- 分支不刪:分支是 git 裡的紀錄,幾乎不佔空間。要回來繼續做,一行
git worktree add <路徑> <分支>就能重開一份。清完會跑git worktree prune移除 git 端的紀錄,之後就算把資料夾從垃圾桶搬回原位,git 也接不回去;垃圾桶裡的副本主要用來撿回裡面的個別檔案,要繼續開發就用這行重開。
清完的結果:
| 工作樹份數 | 佔用空間 | |
|---|---|---|
| 清理前 | 211 | 48.1GB |
| 搬進垃圾桶 | 122 | 27.9GB |
| 只剩紀錄、直接移除 | 5 | 0 |
| 清理後 | 84 | 20.3GB |
各項容量分別四捨五入,所以相減會差 0.1GB。
最該注意的:做好的東西可能只留在副本裡
剩下的 84 份裡,有 27 份是「最新進度沒推上遠端,而且超過 30 天沒動」。這種副本最麻煩:做好的檔案留在副本裡,主資料夾看不到,做好了卻找不到。
我逐份對了一下官網主線:
- 5 份的文章其實已經上線了。我的上線流程會把一篇文章的所有修改壓成一個新的 commit 合進主線,所以副本裡原本那串 commit 看起來「沒推上去」,內容早就在網站上。
- 22 份的文章不在主線上。可能是寫到一半放著、可能是改了方向,也可能是真的做好了忘記上線。這些要我自己一份一份看,AI 不能替我決定。
這是這次盤點最有價值的部分。空間清出來是附帶的,真正要緊的是發現有 22 份工作,只存在這台電腦的某個角落。
不想等硬碟爆了才發現:掛進每月健檢
這次是剛好看到有人提才去查。為了不靠運氣,我把工作樹盤點加進每個月 1 號跑的知識庫健檢,規格是:
- 每月記一次各專案的份數、佔用空間、可清份數、可能遺落成果的份數,跟上個月比
- 只盤點,不清。清不清由我點頭,AI 照上面三個原則動手
- 可能遺落成果的那幾份,逐份列出來給我看
判斷「能不能清」的五個檢查點寫成一支只讀不寫的小腳本,每月健檢跑同一支,結果才比得起來。這支腳本和規格也交給另一家 AI 審過一輪,審出 5 個必改:除了上面提到的 gitignore,還有「只看資料夾最外層的修改時間,會把正在改深層檔案的副本誤判成閒置」、「git 指令失敗時被當成沒問題」這類漏洞,都已經改掉。
- 寫了一堆規則給 AI,為什麼還是沒人執行?:為什麼這類檢查要掛在每月健檢這種已經會跑的流程上,別另外寫一條沒人執行的規則。
可以直接貼給 AI 的盤點提示詞
貼給 Claude Code 或 Codex 都可以。它會先列清單,你看過說可以才動手:
幫我盤點[填你放程式專案的資料夾路徑]底下所有 git 工作樹(worktree),先只列清單,不要清任何東西。不要掃整個硬碟。 先對每個有工作樹的專案跑 git fetch --all --prune,再逐份檢查: 1. 有沒有沒存的改動(git status --porcelain) 2. 有沒有被 gitignore 的檔案(git ls-files -o -i --exclude-standard --directory,node_modules 這類可以重新安裝的不算) 3. 最新進度有沒有推上遠端(git branch -r --contains HEAD) 4. 有沒有被 lock 5. 副本裡所有檔案最後一次修改是幾天前 用表格列出每一份的專案、分支、大小、五項結果。 五項都沒問題、而且 7 天以上沒動的,標成「可清」。 沒推上遠端、而且 30 天以上沒動的,標成「可能遺落成果」,並查主線上有沒有同樣的內容。 我確認後才清。清的方式: 先試 2 份,確認沒問題再做其他的; 整個資料夾搬到垃圾桶,不要用 rm 刪除; 在垃圾桶裡另開一個帶日期時間的資料夾,按專案分開放,避免同名覆蓋; 搬之前再重驗一次第 1 到 4 項; 分支不要刪; 搬完跑 git worktree prune,最後再列一次清理後的表格。
- 兩個 AI 同時改一個網站,為什麼會打架?:一篇文章一份工作樹的由來。
- 寫了一堆規則給 AI,為什麼還是沒人執行?:每月健檢為什麼是對的掛載點。
- 在家裡桌機上用 Codex 做好網頁後,出門用筆電想要改,就找不到檔案了?:程式專案為什麼要放在 git,不要放在同步雲端資料夾。
- 想用 AI 提升效率,結果都在瞎忙?:先刪掉再自動化,這次清工作樹也是先盤點再動手。