我接手一個專案後,文件要求在部署流程中執行一條遞迴修改權限的指令。這是文件既有步驟,我沒有特別懷疑,就照著做:

Terminal window
chmod -R ug+rwx storage bootstrap/cache

指令跑完沒多久,Mac 開始發燙,風扇持續轉,整台機器摸起來很燙。這篇記錄的不是「不要照文件做」,而是一次很實際的追查:一條看似合理的遞迴 chmod,怎麼把我帶到 Spotlight、圖片搜尋,以及最後把所有 Git 專案排除索引的決定。

這條指令會遞迴修改 storagebootstrap/cache 底下的權限;不只資料夾,裡面的圖片檔也一起被改到。當下的需求確實是讓應用程式可寫入這些位置,所以我只是照文件操作。

後來回頭看,這個動作同時留下了兩個線索。第一個是 Git:大量檔案的 mode 從 100644 變成 100755,內容沒改,git status 卻把它們視為修改。第二個是系統:同一批檔案的權限 metadata 被大量更新,而 Mac 隨即進入高負載與高溫狀態。

當時我還不知道兩件事有沒有關係,只知道要先弄清楚到底是哪個背景工作在吃 CPU。

監控後看到的,是 Spotlight 正在工作

我另外開了一個 Agent session,專門監控系統狀態。我在 Activity Monitor 看到整體 CPU 一度來到 60–70%;Agent 進一步監控後,發現 mdsmds_stores 和多個 mdworker_shared 同時運作,這些都是 Spotlight 的索引程序。

Spotlight 在替圖片做什麼?

Spotlight 的工作不是保護檔案,也不是備份。它是在替搜尋準備索引:讀取檔案 metadata、讓圖片可以被內容關鍵字找到,截圖或掃描 PDF 也可能透過 OCR 變得可搜尋。

這對「照片」App 或日常文件很有用;例如要找某張海邊照片,直接輸入描述就能找到。

開發專案需要嗎?

我接著想:放在專案裡的產品圖、規格圖與開發素材,真的需要透過 Spotlight 找到嗎?這裡的圖片被重新處理,對我的開發工作沒有實質價值,卻可能在檔案權限大量變動後帶來不必要的 CPU 負擔。

問題於是從「怎麼讓 CPU 降下來」變成更明確的一句:能不能讓 Spotlight 不要索引開發專案?

為什麼一開始會懷疑 macOS 26?

這不是只因為我剛好升級了系統。Apple 把 macOS Tahoe 26 稱為 Spotlight「最大的一次更新」:它把檔案、資料夾、App、訊息等結果整合並依相關性排序,加入第三方雲端文件、Apps/Files/Actions/Clipboard 瀏覽,以及透過 App Intents 執行動作的能力。Apple 的 macOS Tahoe 26 發表

同時,網路上確實已有相近的異常回報。Macworld 一位編輯在升級 Tahoe 後遇到反覆卡頓,追到 corespotlightd 長時間超過 100% CPU、偶爾接近 200%;他關閉 Spotlight 相關選項後,卡頓停止。Macworld 的個案紀錄 Apple Community 也有使用者回報升級 26.0.1 後,mds_stores 持續占用超過 85% CPU。Apple Community 討論

這些是公開個案,不等於 Apple 已證實「macOS 26 會提高圖片掃描機率」,更不能單獨證明我的問題就是系統 bug。不過當監控畫面正好出現 Spotlight 的索引程序時,它們足以讓 Agent 把 Spotlight 列為優先排查方向,而不是憑空猜一個名字。

剛升級 macOS 時,Spotlight 在一兩天內重新建立索引本來就可能發生,所以第一個猜測是:這會不會只是 macOS 26 更新後的正常背景工作?但這台機器已經升級一段時間,而且高峰剛好接在遞迴改權限之後,值得繼續追。

兩種排除方式:系統 UI,或標記檔

第一種:做法是從 macOS 的 Spotlight 隱私權設定中,將指定資料夾加入排除清單。

第二種:做法是在要排除的資料夾中放入 .metadata_never_index。它是空白標記檔,告訴 Spotlight 不要為這個資料夾建立索引;日後移除它,就能讓索引恢復。對開發專案而言,這比逐一調整每個子資料夾更容易維護。

一開始我想在單一 repo 的圖片資料夾放這個檔案,但馬上想到:我所有開發專案都不需要 Spotlight。每個 repo 都加一次,反而會讓設定散落在專案中,還會多出不該 commit 的檔案。

最後的設定:在 ~/git 一次排除所有專案

最後我把 .metadata_never_index 放在 ~/git 的最上層。這個資料夾本身不是 Git repo,卻是所有開發專案的共同父層;一個標記檔就能涵蓋底下所有 repo,也不會污染任何一個工作目錄。

設定後,我重新執行原本那條 chmod -R ug+rwx 做測試,再每 8 秒觀察一次 CPU 和 load average。這次 mdsmds_stores 都維持在低使用率,畫面上雖然還看得到短暫出現的 mdworker_shared,但沒有再出現持續的高 CPU 峰值;機器仍會稍微升溫,卻不再像剛才那樣燙。

最後再依 Git 記錄的 mode 還原權限,確認工作目錄乾淨。這一步也讓整件事收得很完整:照文件補權限可以,但要知道它會碰到整棵資料夾;而對我來說,開發專案不需要 Spotlight 這層圖片搜尋,乾脆在 ~/git 一次排除,是最省心的結果。