想清掉建置暫存檔,先跑git clean -nd,結果清單裡只有筆記,卻沒有build目錄?這通常和忽略規則有關。git clean預設不把被忽略的檔案列入清理範圍;「沒有列出」不代表那個目錄不存在,也不代表工作目錄已經沒有多餘檔案。
先確認你正在看哪個工作目錄
到要檢查的儲存庫根目錄,再執行下面兩行。第一行顯示根目錄路徑,第二行把被忽略的項目也列出來。這裡只盤點檔案,不做刪除。
git rev-parse --show-toplevel
git status --short --ignored
短格式中,??代表未追蹤,!!代表被忽略。它們都可能是還沒納入版本紀錄的檔案,但用途不同:被忽略的目錄可能放建置產物,也可能放本機設定或使用者上傳內容。不要只看標記就認定可以刪。
用三種預覽對照忽略規則
以下三行都有-n,只顯示預計處理的項目,不實際移除。-d讓未追蹤目錄也納入檢查;小寫x和大寫X則是兩種不同範圍。
git clean -nd
git clean -ndx
git clean -ndX
第一行沿用忽略規則;第二行連被忽略的未追蹤檔案也列入;第三行只列被忽略的檔案。這組指令沒有另外指定命令列排除規則,適合先看三者差異。保留-n,別在還沒核清單前換成強制刪除。
用一個小目錄理解輸出
假設儲存庫已追蹤README.md和.gitignore,忽略規則包含build/。目前另外放了一個未追蹤的notes.txt,以及build目錄裡的cache.txt。
在這個例子中,git status --short --ignored會分別以??及!!標示notes.txt和build目錄。git clean -nd預覽notes.txt;加小寫x後也會列出build目錄;改大寫X則只列build目錄。Git的提示語言可能不同,對照檔案路徑和標記即可。
README.md已在索引中,不會因為加了x就變成清理對象。git clean也不是用來還原已追蹤檔案的修改;若問題是改壞了既有程式,要另查差異與還原範圍。
縮小到一個目錄再核對
只想調查build目錄時,把路徑寫在--後面,避免把整個工作目錄的候選項混在一起。下面仍然只是預覽,也會包含該路徑內被忽略的未追蹤檔案。
git clean -ndx -- build/
先確認build確實是可重建的產物,而且沒有手動放入的重要檔案。若輸出包含.env、uploads、資料庫備份或不認識的路徑,就停下來查用途。被Git忽略,不等於有備份。
預覽清單不是恢復保證
Git沒有追蹤、也沒提交過的檔案,不能指望刪除後從提交歷史找回來。正式清理前先保留需要的資料,再按照確定的路徑範圍操作。若目錄內還有另一個Git儲存庫,也不要為了讓它出現在清理結果而增加強制參數;先弄清楚那是什麼專案。
這篇先做到盤點:確認所在目錄、辨認未追蹤與忽略項目,再比較預覽範圍。清單和預期不同時,查忽略規則與檔案用途,比反覆加強制參數更有幫助。

評論0