⚙️ 環境設定 · Git Hooks

Stop Hook:Claude 回覆完,自動備份

每次 Claude 回答你一句話,背後就默默跑一次 Git 同步——
把你的設定、記憶文件全部備份到 GitHub 雲端。
本文從零解釋原理,帶你一步步設置好。

📦 Repo 是什麼 🪝 Stop Hook 原理 🔄 每次都觸發? 🧳 打包行李邏輯 ⚙️ 配置步驟 ✅ 驗證成功

Repo(倉庫)是什麼?

在聊 Stop Hook 之前,先搞懂幾個字——不然後面全是黑話。

📦 比喻:倉庫
Repo = Repository = 代碼倉庫

想像一個神奇的文件夾,裡面記錄了每一次的改動歷史:
誰在什麼時候改了什麼、改了哪幾行——全部都有記錄。

就像公司的「文件修訂記錄本」,你永遠可以翻回任何一個版本。
這個文件夾,就叫 Repo(倉庫)。
英文全名中文比喻
RepoRepository代碼倉庫 / 倉庫記錄歷史的神奇文件夾
Git版本控制工具倉庫的管理員
Commit提交 / 存檔按下「存檔」鍵,記錄此刻狀態
Push推送 / 上傳把本機改動上傳到雲端
Pull拉取 / 下載把雲端最新版本抓回本機
Branch分支倉庫的「版本線」,master 是主線

所以你在 Claude Code 底部看到的「master」,就是說:
目前在這個倉庫的主線版本上工作。

✅ 記住這一句
Repo(倉庫)= 有版本記錄的文件夾。
GitHub = 把你的倉庫存到雲端的服務。
Git = 管理這一切的工具。

Stop Hook 是什麼?

Claude Code 支援「鉤子(Hooks)」——你可以設定:在某個事件發生後,自動跑一段指令

🪝 比喻:離開辦公室的自動動作
每次你下班走出辦公室(=Claude 回覆完畢),門口感應器自動觸發:
鎖門、關燈、備份今天的工作文件到雲端。

你不需要記得做這些,自動就跑了
這個「感應器 + 自動動作」,就是 Stop Hook。

Claude Code 有哪些 Hook?

Hook 名稱何時觸發常見用途
StopClaude 完成一次回覆自動備份、寫日誌
PreToolUseClaude 呼叫工具之前安全審計
PostToolUseClaude 呼叫工具之後記錄操作
Notification有通知事件時手機推送

我們用的是 Stop Hook——Claude 每回覆完一次,就自動跑備份指令。

Stop Hook 觸發時機
你傳訊息給 Claude
Claude 思考 + 回覆
Claude 回覆完畢
Stop Hook 自動觸發!
跑 Git 備份指令

每次 Claude 回覆都觸發一次?!

💬 Thomas 的問題(你可能也有同樣疑問)
「我跟 Claude 講一句,Claude 回一句,就跑一次 Stop Hook、一次 Git sync?
如果聊天框有很多對話,Claude 回了幾十次,就觸發幾十次?!」

答案:對,但不是你想的那樣

Stop Hook 確實每次回覆都觸發。但「觸發」不等於「真的 push 到 GitHub」。
這裡有個智能過濾機制——下一節詳細解釋。

情況Hook 觸發?真的 Push?原因
純聊天,沒改任何文件 觸發 不 Push 沒有新改動,跳過
Claude 修改了記憶文件 觸發 Push! 有新改動,備份上傳
Claude 更新了 CLAUDE.md 觸發 Push! 有新改動,備份上傳
你用 /clear 清空對話 不觸發 不 Push /clear 是客戶端指令,不經過 Claude 回覆流程

智能過濾:有改才 Push,沒改就跳過

🧳 一句話版本:打包行李
Stop Hook 每次觸發只做三步:

① 打包行李 — 把所有改過的文件放進「待寄箱」
② 檢查箱子 — 箱子裡有東西嗎?
③ 有東西 → 寄出去;沒東西 → 什麼都不做

就這麼簡單。上一輪只是查了天氣,沒改過任何文件,箱子是空的,Stop Hook 打開看一眼就收工了。
這一輪新建了記憶文件,箱子裡有東西,就自動打包寄出去——commit + push 到 GitHub 雲端。
打包行李流程圖
Claude 回覆完畢
Stop Hook 觸發
① 打包行李
git add -A
② 檢查箱子
git diff --cached --quiet
箱子是空的
收工回家
什麼都不做
箱子有東西!
③ 寄出去
commit → pull → push

對應到真正跑的 Git 指令如下:

# Stop Hook 完整指令 git -C /d/Backup/Downloads add -A # ↑ 把所有改動加入暫存區 && git -C /d/Backup/Downloads diff --cached --quiet # ↑ 檢查:暫存區有東西嗎? # 有改動 → 指令失敗 → 觸發 || 後面的動作 # 沒改動 → 指令成功 → 停止,什麼都不做 || ( git -C /d/Backup/Downloads commit -m "auto-sync: desktop" # ↑ 存檔(建立快照) && git -C /d/Backup/Downloads pull --rebase origin master # ↑ 先抓雲端最新版,避免和其他電腦的改動衝突 && git -C /d/Backup/Downloads push origin master # ↑ 上傳到 GitHub 雲端(真正的備份) )

關鍵:git diff --cached --quiet 這一行

🧠 邏輯比喻
就像保全人員離開前的檢查清單:

「今天有沒有新的東西需要放進保險箱?」
→ 鎖進保險箱,上傳雲端備份
沒有 → 什麼都不做,直接回家

所以就算 Claude 跟你聊了 100 句,
只要沒修改任何文件,保安就 100 次都直接回家——不浪費
智能過濾流程圖
Stop Hook 觸發
git add -A
把所有改動加入暫存
有新改動嗎?
❌ 沒有
停止
不做任何事
✅ 有!
commit
存檔快照
pull --rebase
先抓雲端最新
push
上傳 GitHub!
✅ 正確理解
Thomas 說的對了一半:
Stop Hook 確實每次回覆都跑一次 ✓
但 Git Push 不是每次都發生——只有檔案真的有改動才 Push ✓

純聊天 → Hook 跑了,但一秒就退出,什麼都沒上傳,完全不浪費。

怎麼設置 Stop Hook?一步一步做

小白也能做到,只需要改一個 JSON 文件。

前提條件

⚠️ 先確認這些
1. 你的工作目錄已經是一個 Git Repo(已執行過 git init
2. 已連接到 GitHub 遠端(git remote -v 能看到 origin URL)
3. 已安裝 Git(git --version 有輸出)

如果還沒做這些,先看: Git 私人備份 Repo 小白指南 →

設置步驟

完整的 settings.json 範例

{ "permissions": { "defaultMode": "bypassPermissions" }, "hooks": { "Stop": [ { "matcher": "", // matcher 留空 = 所有情況都觸發 "hooks": [ { "type": "command", "command": "git -C /d/Backup/Downloads add -A && git -C /d/Backup/Downloads diff --cached --quiet || (git -C /d/Backup/Downloads commit -m \"auto-sync: desktop\" && git -C /d/Backup/Downloads pull --rebase origin master && git -C /d/Backup/Downloads push origin master)" } ] } ] } }
⚠️ 改這裡:把路徑換成你的
/d/Backup/Downloads 換成你的工作目錄路徑
D:\Projects → 寫成 /d/Projects
C:\Users\Tom\work → 寫成 /c/Users/Tom/work

commit 訊息也可以自訂

# 台式機 commit -m "auto-sync: desktop" # 筆記本 commit -m "auto-sync: laptop" # 這樣 GitHub 上的記錄就能看出是哪台機器做的備份

怎麼確認 Hook 成功在跑?

方法一:看 GitHub 上的 commit 記錄

方法二:在 Claude Code 裡問

# 請 Claude 執行以下指令查最近的 commit git -C /d/Backup/Downloads log --oneline -5

如果看到最近有「auto-sync: desktop」的記錄,說明 Hook 正在工作。

✅ 成功的樣子
4fb6ad0 auto-sync: desktop
77e51c5 auto-sync: desktop
f3fa53a auto-sync: desktop


每次 Claude 改了文件之後,都會多一條這樣的記錄。

常見問題排查

現象可能原因解決方法
Hook 沒跑 重啟 Claude Code 才生效 關掉再重開 Claude Code
跑了但沒 push 文件沒有改動(正常!) 修改一個文件再試
push 失敗 GitHub 認證問題 確認 GitHub token 有效,或用 HTTPS URL 含 token
Conflict 衝突 兩台電腦改了同一行 手動解決衝突,告訴 Claude 哪個版本正確
🎯 總結:三句話記住
1. Stop Hook = Claude 每次回覆後自動跑一個指令
2. 智能過濾 = 有改動才 push,純聊天不浪費
3. 配置方法 = 在 .claude/settings.json 的 hooks.Stop 加入 git 指令