
我請 AI 開了一個放舊版程式的暫時資料夾,用完要清掉時,清掉的東西多了一部分,連主專案的零件也被刪了。這篇記錄事情怎麼發生、怎麼補回來,以及之後收尾的固定做法。
刪暫時資料夾時,連主專案的零件倉庫也被搬走一部分
我想證明程式大改前後,模擬算出的數字完全相同,但手上沒有舊版的結果。所以請 AI 另開一個暫時資料夾放舊版程式,並在裡面貼一張指向主專案零件倉庫的便條紙(Windows 的 junction,一種資料夾捷徑),兩邊共用同一包零件,省得重裝。
對照跑完後,AI 下指令清掉暫時資料夾。清潔工看到便條紙,就順著它走進倉庫開始搬東西,搬到一半因為路徑太長卡住才停。畫面只報「路徑太長」,完全沒提它碰了另一個專案。
我是事後主動清點倉庫,才發現零件少了一部分。刪除失敗時,錯誤訊息只會講它自己卡在哪,不會告訴你它還波及了哪裡,所以失敗後要先清點受影響的範圍,再決定要不要重試。
技術細節:worktree 加 junction 的刪除行為
步驟:
git worktree add <暫存路徑>/base <舊 commit>,再mklink /J base\node_modules <主專案>\node_modules。 收尾的git worktree remove --force把 junction 當一般子目錄遞迴刪除,刪到連結另一端的真實檔案。 因node_modules層級深,撞到 Windows 路徑長度上限,回報Filename too long,停在主專案已被刪一部分的狀態。 事後檢查:主專案node_modules/.bin整個消失,另有少數套件目錄不見。
先拆便條紙、再照清單重進貨,倉庫就補得回來
發現少東西後,我沒有重試刪除。第一步是只拆掉便條紙本身,確認暫時資料夾裡已經沒有任何連結,才把整個資料夾丟掉。
接著在主專案照零件清單(lockfile,記錄每個套件與版本的清單)把倉庫清空重裝。重裝後型別檢查、全套測試、打包流程都通過,清單檔也沒有變動。受影響的只有本機的零件包,程式碼與 git 紀錄都沒被碰到。
能補回的是清單上列的所有東西。清單以外的補不回,例如手動裝過卻沒登記的套件,或打包快取(快取下次啟動會自動重建)。這次我補查過,專案沒有額外修補檔,也沒有安裝後自動執行的腳本,套件檢查沒有缺漏或多餘,所以實際上沒有補不回的東西。
遇到共用資源被誤刪,修完之後還要確認清單以外有沒有東西遺失,否則「測試通過」只證明清單上的部分。
技術細節:止血與修復指令
拆連結:
cmd /c rmdir <junction>。不帶/s時只移除連結,不碰另一端。 確認:dir看暫時目錄內不再有<JUNCTION>,才刪目錄。 修復:主專案跑npm ci,清空node_modules並依package-lock.json重裝。 驗證:型別檢查、全套測試、expo-doctor、expo export通過,git status顯示 lockfile 無變動。 邊界檢查:無patches/、無 postinstall 腳本,npm ls無缺漏或多餘。
收尾順序要寫成死規矩,因為 AI 的捷徑本身沒有錯
共用零件包這個捷徑本身合理,AI 漏想的是收尾。所以我把規矩定成固定順序:先拆便條紙,確認拆乾淨,最後才刪資料夾。任何會一路往下刪的指令,都不要讓它直接面對連結。
更好的做法是少開暫時資料夾。要看舊版內容,可以直接從 git 讀舊檔,或在改動前就把對照數字存下來。動共用資源之前,也先留一份當下的零件清單,事後逐項比對。
這次 AI 主動回報了自己造成的問題,修好後補查復原範圍,並把規矩寫進專案記憶,之後每次對話開頭都會讀到。事故處理的順序是出事、止血、修復、查邊界、記規則,換個情境也能照用。
這類悄悄壞掉的例子,我另外整理在 靜默失敗圖鑑:Expo 與 React Native 上那些不報錯的壞法,AI 協作時怎麼驗收則寫在 AI 協作開發:非技術 PM 的驗收閘門。
技術細節:預防清單
收尾順序:
rmdir拆連結,dir確認,最後才刪目錄;避免--force、rm -rf、rmdir /s直接面對 junction 或 symlink。 替代做法:在主專案用git show <commit>:<path>讀舊檔,或改動前先存對照數字。 留底:npm ls --all > before.txt,事後與現況比對,可涵蓋 lockfile 以外的項目。
本篇為每週 AI 日誌,本週主題指定為筆記「刪暫時工作目錄會順著連結刪到主專案:git worktree 與 node_modules junction」。