Thomas 讓 Claude 刪除 AnyDesk,正常完成。接着讓 Claude 記住百度網盤路徑,Claude 也照做了。一切看似正常——直到 Thomas 問了一句:
「你剛才有沒有觸發 Stop Hook?」
Claude 的回答暴露了問題:「你有沒有設定 hooks?」——它根本不知道自己有 Stop Hook。
settings.local.json(沒有 hooks),完全沒讀全局 settings.json(有 Stop Hook)。AI 失憶了。
Claude Code 有兩層設定系統:全局的 settings.json 和本地的 settings.local.json。你可能以為它們會「合併」——local 的補充 global 的,兩邊都生效。
錯。合併規則是「替換」(override),不是「合併」(merge)。
hooks + permissions + memory
只有 permissions
hooks 從全局繼承?
問題的核心:當 settings.local.json 有 permissions key 時,它會完全遮蔽全局 settings.json 裡的 permissions。同理,如果 local 裡有其他 key,也會遮蔽全局的相同 key。
settings.json 有完整配置:hooks、permissions、memory 規則。
但啟動目錄下有一個
settings.local.json,裡面只有 permissions(因為兩台電腦路徑不同,所以需要本地設定)。
結果:Claude 讀了 local 的
permissions,但 hooks 設定就此消失——因為 Claude 讀到了 local,就不再去看全局的同類配置。
設定覆蓋只是問題的一半。另一半更隱蔽:記憶碎片化。Claude Code 根據你的啟動目錄建立項目級配置,每個目錄有自己的記憶庫。
| 啟動目錄 | 記憶條數 | 說明 |
|---|---|---|
C:\Windows\System32 |
2 條 | Windows cmd 的預設目錄,幾乎是空的 |
C:\Users\Administrator |
5 條 | 偶爾從這裡啟動,零散幾條 |
D:\Backup\Downloads |
40+ 條 | 主工作目錄,完整的記憶庫 |
C:\Windows\System32。Thomas 從這裡啟動 Claude Code,Claude 只能讀到 2 條記憶,而 Thomas 的主記憶庫(40+ 條)在 D:\Backup\Downloads,完全讀不到。
你以為 AI 記得你的所有偏好、路徑、習慣。但實際上,它讀到的是幾乎空白的記憶。
Thomas 遇到的不是個案。以下是 GitHub 上的相關 Issues,全部指向同一個設計缺陷。
| Issue | 狀態 | 描述 | 與本文的關係 |
|---|---|---|---|
#17017 |
OPEN | settings 合併規則是「替換」不是「合併」 | 最大痛點 |
#34822 |
OPEN | settings.local.json 遮蔽全局 permissions | 直接原因 |
#26770 |
OPEN | Stop hook 在 settings.json 中不觸發 | hooks 消失 |
#6305 |
OPEN | hooks 在 session 啟動時快照鎖定 | 相關機制 |
#17017 是根本原因(替換而非合併),#34822 是 Thomas 遇到的直接問題(local 遮蔽 global),#26770 是後果(hooks 不觸發)。
理解 Thomas 的架構才能明白為什麼這個坑特別深。他有台式機和筆記本兩台電腦,透過 GitHub repo 同步 Claude Code 配置。
效果:Claude 以為它在讀本地文件,實際上讀的是 git repo 裡的共享文件。
git add + commit + push。效果:台式機改了記憶,筆記本 git pull 後立刻同步。
D:\Backup\Downloads,筆記本 C:\Users\abc25\repos\downloads-config。所以 local 文件是故意設計的,用來處理路徑差異。問題是它意外遮蔽了 hooks。
Thomas 找到了兩個方案。兩個都能解決問題,但成本完全不同。
+ cmd 打開就在 git repo 目錄
+ Claude 自動讀到完整配置
+ 不需要額外維護
(本機硬碟正常不會發生)
- 兩台電腦都要建
- 維護成本高
- 新增目錄要記得再建一次
:: 台式機(D 盤) reg add "HKCU\Software\Microsoft\Command Processor" /v AutoRun /t REG_SZ /d "cd /d D:\Backup\Downloads" /f :: 筆記本(C 盤) reg add "HKCU\Software\Microsoft\Command Processor" /v AutoRun /t REG_SZ /d "cd /d C:\Users\abc25\repos\downloads-config" /f
執行後,每次打開 cmd 會自動切換到你的 git repo 目錄。Claude Code 從這裡啟動,自然讀到完整的 settings.json 和 40+ 條記憶。
ipconfig、ping、netstat 等系統命令都在 PATH 裡,從任何目錄都能正常執行。reg delete "HKCU\Software\Microsoft\Command Processor" /v AutoRun /f
Thomas 把這次教訓存進了共享記憶庫(CLAUDE.md),確保兩台電腦的 Claude 都知道這個規則。
settings.local.json 或獨立的記憶文件。
所有配置必須通過全局 settings.json 管理,所有記憶必須存入共享記憶庫。
原因:本地設定會覆蓋全局設定,導致 hooks 消失和記憶碎片化。
D:\Backup\Downloads
筆記本:
C:\Users\abc25\repos\downloads-config
所有 Claude Code 對話都從這些目錄啟動,確保讀到完整配置和主記憶庫。
Thomas 把三個目錄的記憶(System32 的 2 條、Administrator 的 5 條、Downloads 的 40+ 條)合併到主記憶庫 D:\Backup\Downloads,然後刪除其他兩個目錄的零散記憶。從此只有一份記憶。
D:\Backup\Downloads,讀到完整的 40+ 條記憶,Stop Hook 正常觸發。問題徹底解決。
C:\Windows\System32,但你的項目在 D:\projects,Claude 啟動時讀到的記憶可能是空的。ipconfig、ping 等)也不受影響,因為它們在 PATH 裡,從任何目錄都能執行。#17017 要求把「替換」改成「深度合併」或至少提供選項。目前 (2026-04) 還是 OPEN 狀態。在官方修復之前,最好的策略是:確保只從一個固定目錄啟動 Claude Code,並把所有需要的配置都放在那個目錄下。