Part 1 · 基礎概念
Repo(倉庫)是什麼?
在聊 Stop Hook 之前,先搞懂幾個字——不然後面全是黑話。
📦 比喻:倉庫
Repo = Repository = 代碼倉庫想像一個神奇的文件夾,裡面記錄了每一次的改動歷史:
誰在什麼時候改了什麼、改了哪幾行——全部都有記錄。
就像公司的「文件修訂記錄本」,你永遠可以翻回任何一個版本。
這個文件夾,就叫 Repo(倉庫)。
| 英文 | 全名 | 中文 | 比喻 |
|---|---|---|---|
| Repo | Repository | 代碼倉庫 / 倉庫 | 記錄歷史的神奇文件夾 |
| Git | — | 版本控制工具 | 倉庫的管理員 |
| Commit | — | 提交 / 存檔 | 按下「存檔」鍵,記錄此刻狀態 |
| Push | — | 推送 / 上傳 | 把本機改動上傳到雲端 |
| Pull | — | 拉取 / 下載 | 把雲端最新版本抓回本機 |
| Branch | — | 分支 | 倉庫的「版本線」,master 是主線 |
所以你在 Claude Code 底部看到的「master」,就是說:
目前在這個倉庫的主線版本上工作。
✅ 記住這一句
Repo(倉庫)= 有版本記錄的文件夾。GitHub = 把你的倉庫存到雲端的服務。
Git = 管理這一切的工具。
Part 2 · 核心概念
Stop Hook 是什麼?
Claude Code 支援「鉤子(Hooks)」——你可以設定:在某個事件發生後,自動跑一段指令。
🪝 比喻:離開辦公室的自動動作
每次你下班走出辦公室(=Claude 回覆完畢),門口感應器自動觸發:鎖門、關燈、備份今天的工作文件到雲端。
你不需要記得做這些,自動就跑了。
這個「感應器 + 自動動作」,就是 Stop Hook。
Claude Code 有哪些 Hook?
| Hook 名稱 | 何時觸發 | 常見用途 |
|---|---|---|
| Stop | Claude 完成一次回覆後 | 自動備份、寫日誌 |
| PreToolUse | Claude 呼叫工具之前 | 安全審計 |
| PostToolUse | Claude 呼叫工具之後 | 記錄操作 |
| Notification | 有通知事件時 | 手機推送 |
我們用的是 Stop Hook——Claude 每回覆完一次,就自動跑備份指令。
Stop Hook 觸發時機
你傳訊息給 Claude
→
Claude 思考 + 回覆
→
Claude 回覆完畢
↓
Stop Hook 自動觸發!
→
跑 Git 備份指令
Part 3 · 常見問題
每次 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 回覆流程 |
Part 4 · 關鍵邏輯
智能過濾:有改才 Push,沒改就跳過
🧳 一句話版本:打包行李
Stop Hook 每次觸發只做三步:① 打包行李 — 把所有改過的文件放進「待寄箱」
② 檢查箱子 — 箱子裡有東西嗎?
③ 有東西 → 寄出去;沒東西 → 什麼都不做
就這麼簡單。上一輪只是查了天氣,沒改過任何文件,箱子是空的,Stop Hook 打開看一眼就收工了。
這一輪新建了記憶文件,箱子裡有東西,就自動打包寄出去——commit + push 到 GitHub 雲端。
打包行李流程圖
Claude 回覆完畢
Stop Hook 觸發
Stop Hook 觸發
↓
① 打包行李
git add -A
git add -A
↓
② 檢查箱子
git diff --cached --quiet
git diff --cached --quiet
箱子是空的
↓
收工回家
什麼都不做
什麼都不做
箱子有東西!
↓
③ 寄出去
commit → pull → push
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!
上傳 GitHub!
✅ 正確理解
Thomas 說的對了一半:Stop Hook 確實每次回覆都跑一次 ✓
但 Git Push 不是每次都發生——只有檔案真的有改動才 Push ✓
純聊天 → Hook 跑了,但一秒就退出,什麼都沒上傳,完全不浪費。
Part 5 · 動手設置
怎麼設置 Stop Hook?一步一步做
小白也能做到,只需要改一個 JSON 文件。
前提條件
⚠️ 先確認這些
1. 你的工作目錄已經是一個 Git Repo(已執行過 git init)2. 已連接到 GitHub 遠端(
git remote -v 能看到 origin URL)3. 已安裝 Git(
git --version 有輸出)如果還沒做這些,先看: Git 私人備份 Repo 小白指南 →
設置步驟
-
1找到 settings.json 文件
位置:你的工作目錄下的.claude/settings.json
例如:D:\Backup\Downloads\.claude\settings.json
用 VS Code 打開,找到"hooks"這個區塊(沒有就自己加) -
2在 hooks 區塊加入 Stop Hook 配置
複製下方的 JSON 片段,貼入你的 settings.json -
3把路徑改成你自己的工作目錄
把/d/Backup/Downloads改成你的實際路徑
注意:Windows 路徑要用正斜線,D:\ 寫成 /d/ -
4重啟 Claude Code
設定只在新的 session 生效。關掉再重開 Claude Code。
完整的 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/ProjectsC:\Users\Tom\work → 寫成
/c/Users/Tom/work
commit 訊息也可以自訂
# 台式機
commit -m "auto-sync: desktop"
# 筆記本
commit -m "auto-sync: laptop"
# 這樣 GitHub 上的記錄就能看出是哪台機器做的備份
Part 6 · 驗證
怎麼確認 Hook 成功在跑?
方法一:看 GitHub 上的 commit 記錄
-
1隨便改一個文件
例如:請 Claude「在記憶裡記下今天的日期」,它會寫入一個 .md 文件 -
2Claude 回覆後等幾秒
Stop Hook 在背景跑,通常幾秒內完成 -
3打開 GitHub,查看你的 Repo 頁面
如果看到「auto-sync: desktop」這條 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 指令