AskClean問淨

Xcode Archives 可以刪嗎?安全移除舊建置

AskClean 團隊 · 更新於 2026-11-02

可以刪除舊的 Xcode Archives,但前提是確認該建置已經停用,也不再需要它的 dSYM 來分析當機報告。請在 Xcode Organizer 逐一檢查 .xcarchive,保留所有仍在 App Store 或 TestFlight 上的建置,只把已被取代的封存丟到垃圾桶。

等角視角的 Xcode 封存套件,分成受保護的目前版本與可以移除的已停用建置
把封存當成發佈紀錄,而不是一般快取:保護目前的建置,已停用的建置則逐一檢查。

為什麼 Xcode Archives 和 DerivedData 不一樣

封存是執行 Product > Archive 的產物:一份可供發佈的建置,以 .xcarchive 套件的形式保存下來。Xcode 預設把這些套件存放在 ~/Library/Developer/Xcode/Archives,依日期分資料夾,並顯示在 Organizer 裡。長期維護的 App 歷經多次候選版本、TestFlight 上傳與正式版,很容易累積大量封存。

和 DerivedData 不同,封存不只是加快建置用的快取。它可能包含那次建置產生的確切 App 二進位檔、建置中繼資料與 dSYM 檔案。Apple 說明,dSYM 是透過 UUID 與二進位檔綁定的;之後即使用同一份原始碼重新建置,也無法產生可以互換的符號檔,因為新的二進位檔會拿到不同的識別碼。

這個差別改變了清理的規則。DerivedData 可以重新產生,代價只是第一次建置比較慢;刪掉的封存卻可能再也無法原樣重建。如果之後收到那個二進位檔的當機報告,而你手上已經沒有對應的符號,堆疊框架就只會顯示記憶體位址,看不到有用的函式名稱與原始碼位置。

刪除前先盤點

從 Xcode 著手,而不是 Finder。開啟 Window > Organizer,選擇 Archives,再選取對應的 App,逐一檢查每份封存的版本、建置編號、建立日期與發佈狀態。Organizer 能提供日期資料夾名稱看不出來的脈絡。

先列保留清單,再列刪除清單。目前使用者還能取得的每個版本、仍在進行的每個 TestFlight 建置、仍安裝在裝置上的企業或 Ad Hoc 建置,以及你可能還要調查當機報告的任何版本,都要保留封存。如果團隊需要某個已知正常版本的匯出二進位檔、公證紀錄或簽署證明,也要一併保留。

不要以為上傳成功,本機的封存就可以丟了。依平台與上傳設定不同,Apple 可能已經收到符號檔,但 Apple 的除錯指南仍建議為每個發佈出去的建置保留封存。本機封存也是把二進位檔、dSYM、版本、建置編號與匯出結果串在一起最清楚的紀錄。

  1. 開啟 Window > Organizer,選擇 Archives。
  2. 選取 App,記下所有仍在使用的正式版、TestFlight、企業或 Ad Hoc 建置的版本與建置編號。
  3. 確認需要上傳的符號都已上傳;如果保留政策有要求,把無法取代的封存複製到有備份的儲存位置。
  4. 只把已被取代的候選版本、放棄的內部建置,以及超出當機調查期間的已停用版本,列為刪除候選。
  5. 在 Organizer 中一次刪除一份候選,確認該保留的項目都還在之後,再清空垃圾桶。

只看日期不是安全的保留政策。新版本推出很久之後,舊的正式版二進位檔仍可能安裝在客戶的裝置上。

測量封存資料夾,但不要改動它

如果目標是磁碟空間,就先測量。在 Finder 按 Command-Shift-G(「前往檔案夾」),開啟 ~/Library/Developer/Xcode/Archives,切換成列表顯示方式,在「顯示方式選項」中勾選「計算所有大小」,再依大小排序。整個過程都是唯讀的,可以讓異常龐大的封存一目了然。

習慣用「終端機」的話,可以執行 du -sh ~/Library/Developer/Xcode/Archives 查看總量;要檢查各個日期資料夾,就執行 du -sh ~/Library/Developer/Xcode/Archives/*,再自行排序輸出結果。這些指令只會測量檔案,不會刪除任何東西。

封存是一種套件,所以 Finder 通常把它顯示成單一項目。追查大小時,可以對複製出來的封存按右鍵,選擇「顯示套件內容」,但不要修改正本套件裡的檔案。挑掉部分內部檔案,可能留下一份看似還在、卻已經無法正確匯出或符號化的封存。

最安全的刪除流程

建議透過 Organizer 刪除,因為操作時 App 名稱、版本與建置編號就在旁邊。選取已確認停用的封存,再使用 Delete。Xcode 會移除該封存套件;視 macOS 與 Xcode 的行為而定,可能會要求你確認。

Organizer 打不開某個很舊或已損壞的套件時,Finder 就派得上用場。前往 Archives 目錄,把 Info.plist 的中繼資料與你的盤點紀錄對照,找出確切的那一份 .xcarchive,只把它丟到垃圾桶。不要只因為日期資料夾的名稱很舊,就把整個資料夾刪掉。

先別清空垃圾桶:等你重新開啟 Organizer、匯出工作流程仍需要的建置,而且在符號攸關業務時,實際把一份具代表性的當機報告符號化之後再說。丟到垃圾桶能留下一段短暫的復原空間;用「終端機」永久刪除只會拿掉這層保險,並不會讓清理更正確。

不會無限膨脹的封存保留政策

實用的政策是依發佈狀態而定,而不是隨意設定的檔案年齡。目前仍在發佈的建置全部保留;最近被取代的正式版,在你仍受理當機報告的期間內保留;企業建置保留到安裝失效為止;法務、客服支援或事故應變政策要求的里程碑版本也要保留。

團隊最好把保留規則明確寫進發佈檢查清單:封存存放在哪裡、dSYM 是否已上傳、誰能取回,以及建置何時可以刪除。如果把封存搬到外接儲存裝置或雲端備份,請實際測試還原,不要假設複製過去的套件就能用。

每個主要發佈週期結束後,回頭檢查這個資料夾。每季花十分鐘檢查,比啟動磁碟滿了才慌忙刪除安全得多。急需低風險的空間時,先清 DerivedData 與過時的模擬器資料;等 Mac 有足夠的工作空間、能冷靜處理時,再檢查封存。

AskClean 如何處理封存

AskClean 刻意不把 Xcode Archives 標成一般的可重建快取。它會掃描 Archives 目錄、逐一列出每個 .xcarchive 套件,並標上「不可復原」的代價警告,讓你逐一檢查舊建置,而不是只能把整個資料夾全刪或全留。

決定權留在你手上。AskClean 能顯示哪份封存佔用了空間,並永久刪除你核准的項目,但它無法知道你的正式版支援期間,也補不回遺失的 dSYM。這條界線是刻意的:儲存空間的自動化應該把發佈產物攤開給你看,而不是默默替你判定它們已經不重要。

封存的刪除界線

先依復原代價分類,再考慮檔案的年齡或大小。

項目預設位置刪除後的變化
DerivedData~/Library/Developer/Xcode/DerivedData從原始碼重建;下次建置與建立索引會比較久。
Xcode 封存~/Library/Developer/Xcode/Archives移除保存下來的二進位檔、中繼資料,還可能包括對應的 dSYM。
匯出的 dSYM 副本你的發佈產物儲存位置可能刪掉某個已發佈二進位檔僅存的符號。
已停用的內部封存~/Library/Developer/Xcode/Archives通常要確認該建置已不再安裝、也不再支援,才適合刪除。

常見問題

可以把 ~/Library/Developer/Xcode/Archives 裡的東西全部刪掉嗎?

不能當成一次全刪的安全操作。封存可能包含已發佈建置的確切 dSYM 與二進位檔。所有仍在使用的正式版、TestFlight、企業或 Ad Hoc 建置,以及你可能還要調查當機的版本,都要保留。

刪除封存會讓 App 從 App Store 下架嗎?

不會。刪除本機的 .xcarchive 不會移除已上傳到 App Store Connect 的 App,也不會刪除客戶裝置上的 App;它刪掉的是你本機的發佈產物,而重新匯出或符號化時可能還需要它。

重新建置同一個 commit,能重新產生一樣的 dSYM 嗎?

無法產生可靠的替代品。dSYM 必須符合已發佈二進位檔的 UUID,而新的建置會產生不同的二進位檔識別碼。請保留原始封存或對應的符號。

需要空間時,應該先刪封存,還是先刪 DerivedData?

通常先刪 DerivedData。它可以重建,是風險較低的首要目標;封存則值得逐版檢查,因為刪錯一份,可能就失去無法取代的除錯證據。

參考來源

繼續盤點 Xcode 儲存空間