環境設定 · 雙機同步 · 踩坑實錄

Claude Code 雙機自動備份系統
小白也能懂的完整指南

Stop Hook 自動觸發、Junction 目錄捷徑、git pull --rebase 防衝突
讓台式機和筆記本的 Claude Code 永遠同步,對話結束自動備份

Claude Code Git / GitHub Stop Hook Junction
1. 問題背景 2. 架構圖 3. Stop Hook 詳解 4. Junction 策略 5. 防衝突機制 6. 踩坑實錄 7. 設置步驟 FAQ
1 這個系統解決什麼問題?

場景:Thomas 有兩台電腦,都裝了 Claude Code

🖥
台式機(Desktop-PC)
家裡主力機,跑繁重任務
IP:192.168.1.207
Tailscale:100.84.165.75
💻
筆記本(OWER / ThinkPad)
外出攜帶,隨時可用
IP:192.168.1.151
Tailscale:100.74.59.34

沒有備份系統時的痛點

台式機學會了新技能(比如怎麼查 Alpaca 期權數據),筆記本完全不知道
筆記本積累了新記憶文件,台式機看不到,下次在台式機要重新教
電腦壞了或重裝 → 所有 Claude Code 記憶、技能、設定全部消失
Thomas 要不斷重複教同一件事 → 浪費時間,讓人沮喪

有了自動備份系統之後

每次對話結束 → 自動 git commit + push 到私人 GitHub repo
另一台電腦開新對話時 → 自動 pull,立刻同步到最新狀態
每天午夜還有 RemoteTrigger 雲端排程 自動備份,雙重保障
兩台電腦的記憶、技能、設定 永遠保持同步,Thomas 只需教一次
比喻:雲端筆記本
就像你用 Notion 或 Google Docs 記筆記——不管在哪台電腦打開,看到的都是最新版本。這個系統的作用完全一樣,只是把「筆記本」換成了「Claude Code 的記憶和技能」。
2 備份架構圖

BACKUP ARCHITECTURE

🖥
台式機
Desktop-PC
Claude Code 在跑
對話結束觸發 Stop Hook
📄
git commit
記錄本次改動
↓↑
pull --rebase + push
先拉後推,防衝突
📜
GitHub 私人 Repo
thomastangnz-commits/
downloads-config
🔒 private
雲端保險箱
每天午夜
RemoteTrigger 自動備份
💻
筆記本
OWER / ThinkPad
Claude Code 在跑
對話結束觸發 Stop Hook
📄
git commit
記錄本次改動
↓↑
pull --rebase + push
先拉後推,防衝突
兩台電腦都向同一個 GitHub repo 備份 ‧ 對話結束自動觸發 ‧ 每天午夜額外備份一次

備份的內容是什麼?

🧠 記憶文件
MEMORY.md、user_thomas.md、所有 feedback 教訓文件
🔧 設定文件
CLAUDE.md、settings.json、.claude/ 目錄全部
🤖 Agent 技能
.claude/agents/、.claude/commands/ 全部指令模板
🚫 不備份
.venv/(852MB 太大)、OAuth Token 文件(含密鑰)
3 Stop Hook 是什麼?
比喻:門口的掛鉤
你家門口有個鉤子,每次出門的那一刻,你都把鑰匙掛上去。這個「出門 → 掛鑰匙」的動作就叫 Hook(掛鉤)。

Stop Hook 就是「對話結束 → 執行備份」的自動掛鉤。你和 Claude 談了一整個下午的策略,一點「+開新對話」,舊對話 session 就算結束,Stop Hook 就自動把所有改動備份到雲端。

📚 這個備份的專業名詞叫什麼?

Event-Driven Incremental Backup
事件驅動式增量備份
事件驅動式
Event-Driven
不是定時跑,而是「某件事發生了」才觸發。這裡的「事件」= Session 結束。
增量
Incremental
只備份「有變化的部分」。沒有改動就跳過,不浪費時間和空間。
備份
Backup
把當前狀態保存到安全的地方(這裡是 GitHub 私人倉庫)。

對比另一種常見備份方式——全量備份(Full Backup):
全量備份 = 每次都把所有文件複製一遍,即使沒有任何改動也做。
增量備份 = 只複製有變化的文件,更快、更省空間。
我們用的 git commit 天生就是增量備份,每次 commit 只記錄「和上次相比,哪裡不一樣」。

🌰 生活比喻:就像你每天下班前,只把今天修改過的文件放進資料夾帶回家,沒動過的文件不用帶。 比起每次把整個辦公桌的東西都搬回家,既快又不佔地方。

什麼是 Session(對話)?

你發第一條消息給 Claude
來回對話,可能幾十條消息
... 繼續聊 ...
你點「+」開新對話 / 輸入 /clear / 關掉 Claude Code
Session 結束 → Stop Hook 觸發 → 自動備份
✓ 會觸發 Stop Hook
手機 App 點「+」開新對話(舊 session 關閉)
在對話框輸入 /clear 清除對話
關掉 Claude Code 進程(Task Manager 結束 / VS Code 關閉)
電腦重新開機(進程被終止)
✗ 不會觸發 Stop Hook
🔴 你發消息,我回覆(對話還在繼續)
🔴 手機切到後台(網絡連接還活著)
🔴 電腦螢幕關掉或進入睡眠(進程還在跑)
🔴 等待 Claude 回覆的過程中

Stop Hook 的設定方式(settings.json)

在 Claude Code 的設定文件裡加入以下片段:

// D:\Backup\Downloads\.claude\settings.json { "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "cd /d D:\\Backup\\Downloads && git add -A && git commit -m \"auto-backup\" --allow-empty && git pull --rebase origin master && git push origin master" } ] } ] } }
重點: git pull --rebase origin master 必須在 push 之前。這樣即使另一台電腦剛推了新的 commit,也能先把對方的版本拉下來,再把自己的改動疊在上面,而不是直接覆蓋。
4 Junction 策略
比喻:門牌號捷徑
你開了一間辦公室在大廈 A,但客戶習慣去大廈 B 找你。你在大廈 B 放一個告示牌「我在大廈 A」——客戶走進大廈 B 看到告示牌,自動被帶到大廈 A。Junction 就是這個告示牌,讓 Windows 以為文件夾在 C 盤,實際上卻指向 D 盤的 Git repo。

JUNCTION STRUCTURE

🖥 台式機
C:\Users\Administrator\.claude\agents
Junction(捷徑)↓
D:\Backup\Downloads\.claude\agents
↑ Git Repo 中的真實路徑
C:\Users\Administrator\.claude\commands
Junction ↓
D:\Backup\Downloads\.claude\commands
💻 筆記本
C:\Users\abc25\.claude\agents
Junction(捷徑)↓
C:\Users\abc25\repos\downloads-config\.claude\agents
↑ Git Repo 中的真實路徑
C:\Users\abc25\.claude\memory
Junction ↓
C:\Users\abc25\repos\downloads-config\claude-sonnet-4-6\memories

效果:兩台電腦的 Claude Code 讀的是同一份文件

Claude Code 打開 agents/ 時,透過 Junction 自動指向 Git repo 裡的真實文件 → 這些文件被 git 追蹤 → Stop Hook 觸發時自動備份推送 → 另一台電腦 pull 後也拿到最新版本

如何建立 Junction(PowerShell 指令)

# 台式機:建立 agents Junction New-Item -ItemType Junction ` -Path "C:\Users\Administrator\.claude\agents" ` -Target "D:\Backup\Downloads\.claude\agents" # 驗證是否建立成功(看 Attributes 有沒有 ReparsePoint) Get-Item "C:\Users\Administrator\.claude\agents" -Force
如果 Attributes 欄位顯示包含 ReparsePoint,Junction 就建立成功了。
5 防衝突機制(為什麼不能直接 push)

🔬 這個防衝突技術叫什麼?

Git Rebase
英文全稱:Git Re-base
完整命令:git pull --rebase origin master

📖 拆字解釋:Re-base 是什麼意思?

Re-(重新)
重新做一次
Base(基底/起點)
我的改動是「基於哪個版本」開始做的

合在一起:「把我的改動,重新搬到最新版本的上面繼續接著做」
就像你在一棟房子的3樓加了個房間(你的改動),
但原來的3樓已經變成4樓了(對方推了新版本),
Rebase 就是自動幫你把你的房間搬到新的4樓上面,變成5樓。

⚔️ Rebase vs Merge:兩種合并方式的區別

❌ Merge(合并)
A(起點)
B 台式機
C 筆記本
↘ ↙
Merge Commit
多出一個「合并紀錄」
歷史記錄分叉,較混亂
✅ Rebase(變基)
A(起點)
B 台式機
C 筆記本(搬過來)
歷史記錄是一條直線,清晰

🌰 生活比喻:你在寫一篇文章(你的改動),朋友在同一份文件裡也加了一段(對方的改動)。
Merge = 你們各自把自己的版本保留,再多加一頁「合并說明頁」記錄兩個版本合在一起了。
Rebase = 把你的那段文字自動接在朋友的段落後面,整篇文章仍然是連貫的一條線,沒有多餘的「說明頁」。

問題:兩台電腦同時改,誰的算數?

假設你早上在台式機加了新的記憶文件,晚上在筆記本又加了另一個記憶文件。如果兩台都直接 push,後推的那一台會被 GitHub 拒絕(因為 GitHub 的版本更新了,不接受基於舊版本的 push)。

🚫 push --force
直接覆蓋 GitHub
對方的工作永久消失
vs
✓ pull --rebase + push
先拉對方的版本
再把自己的改動疊上去

git pull --rebase 的工作原理

GitHub 上的版本
A: 原始版本(共同起點)
B: 台式機加的記憶文件
+
筆記本的本地版本
A: 原始版本(共同起點)
C: 筆記本加的記憶文件
rebase 後的結果
A: 原始版本
B: 台式機的改動
C: 筆記本的改動(疊在 B 上面)
兩台都保留 ✓

三種情況的結果

不同文件各自有改動
自動合并,兩台的改動都保留。最常見的情況,不需要人工介入。
同一個文件,但不同的行各自有改動
git 智能合并不同行,自動處理,兩台都保留。
同一個文件同一行,兩台各自修改(真衝突)
git 停下來報告衝突,需要 Thomas 手動選擇保留哪個版本。極少發生,因為台式機和筆記本通常各自寫各自的文件。
6 踩過的坑(真實案例)
為什麼要看這部分: 這些是在真實設置過程中遇到的問題,不是書上的假設。看完可以少走很多彎路。
1 Stop Hook 缺少 pull --rebase,導致 push 被拒絕
現象
對話結束後,Stop Hook 觸發了,但 git push 失敗,報錯:
error: failed to push some refs to ... Updates were rejected because the remote contains work that you do not have locally.
意思是:另一台電腦先推了新的 commit,你的 push 被 GitHub 拒絕了。
原因
原來的 Stop Hook 命令只有:
git add -A && git commit ... && git push
沒有先 git pull --rebase。當 GitHub 上已經有對方的新版本,直接 push 就被拒絕。
修復
在 settings.json 的 Stop Hook 命令裡,在 push 前加入 git pull --rebase origin master
git add -A && git commit ... && git pull --rebase origin master && git push origin master
2 筆記本 Junction 漏設了 2 個,Claude Code 讀不到共享設定
現象
筆記本的 Claude Code 打開後,看不到 agents/ 目錄裡的技能,也讀不到 commands/ 裡的指令模板,就好像這些文件根本不存在一樣。
原因
筆記本只設了 memory Junction,但 commandsagents 這兩個 Junction 漏建了。Claude Code 按照 C:\Users\abc25\.claude\commands 去找,這個目錄根本不是 Junction,要麼不存在,要麼是個空的普通文件夾。
修復
先用 PowerShell 檢查現有 Junction 狀態:
Get-Item "C:\Users\abc25\.claude\commands" -Force
看 Attributes 是否包含 ReparsePoint(有才是 Junction)。
若沒有,用 New-Item -ItemType Junction 補建兩個漏掉的 Junction。
3 台式機 WinRM 空密碼導致 Windows 在桌面彈出 GUI 憑據框
現象
用筆記本透過 WinRM 遠控台式機時,連線失敗。同時台式機桌面彈出一個 Windows GUI 密碼輸入框,要求輸入憑據,阻礙了後台自動化操作。
原因
台式機的 Administrator 帳號沒有設密碼(空密碼)。Windows 預設有一個安全限制 LimitBlankPasswordUse = 1,意思是「空密碼帳號不允許網絡登錄」。WinRM 連線本質上是網絡登錄,所以被拒絕,Windows 就彈出要求輸入密碼的對話框。
修復
三步修復:
1. 給 Administrator 設真實密碼:net user Administrator WinRM@PC2235!
2. 設定自動登錄(開機不影響體驗):寫入 AutoAdminLogon 注册表
3. 密碼存入 GCP Secret Manager(secret name:winrm-desktop-pc202409302235-admin-password),不留本地明文
7 小白一步步設置指南
前提條件: 兩台電腦都已安裝 Claude Code、Git,並有 GitHub 帳號。
Git 安裝地址:https://git-scm.com/download/win
1
在 GitHub 建立私人 Repo
登入 GitHub → 右上角「+」→ New repository → 名稱隨意(如 downloads-config)→ 必須勾選 Private(絕對不能設 Public,防止洩漏記憶文件)→ Create repository
2
台式機 Clone Repo 到工作目錄
在 PowerShell 或 Git Bash 執行:
cd D:\Backup\Downloads && git init && git remote add origin https://github.com/[你的帳號]/downloads-config.git
或直接 clone:git clone https://github.com/[你的帳號]/downloads-config.git D:\Backup\Downloads
3
建立 .gitignore,排除大文件和敏感文件
在工作目錄建立 .gitignore 文件,加入:
.venv/ node_modules/ *.token *oauth_token* credentials.json *.exe *.msi
4
台式機建立 Junction,讓 .claude 指向 Repo 目錄
以管理員身份打開 PowerShell,執行:
# 如果原有的 .claude\agents 是普通文件夾,先移動內容到 Repo,再刪除,再建 Junction New-Item -ItemType Junction ` -Path "C:\Users\Administrator\.claude\agents" ` -Target "D:\Backup\Downloads\.claude\agents"
5
筆記本 Clone 同一個 Repo
git clone https://github.com/[你的帳號]/downloads-config.git C:\Users\[帳號]\repos\downloads-config
把 [帳號] 換成筆記本的 Windows 用戶名,比如 abc25
6
筆記本建立 Junction(同步設定到同一 Repo)
New-Item -ItemType Junction ` -Path "C:\Users\abc25\.claude\agents" ` -Target "C:\Users\abc25\repos\downloads-config\.claude\agents" New-Item -ItemType Junction ` -Path "C:\Users\abc25\.claude\commands" ` -Target "C:\Users\abc25\repos\downloads-config\.claude\commands"
7
兩台電腦都在 settings.json 加入 Stop Hook
找到各自的 settings.json(通常在 C:\Users\[帳號]\.claude\settings.json),加入 Stop Hook 設定(參考第 3 節的代碼)。
注意:台式機和筆記本的路徑不同,cd 的目標要對應各自的 Repo 路徑。
8
(可選)設定 RemoteTrigger 每天自動備份
這是額外的保障,即使 Stop Hook 沒有觸發(比如電腦直接斷電),也能保證每天至少備份一次。在 RemoteTrigger 雲端任務中加入備份腳本,設定為每天午夜 00:30 執行。
測試方式: 設置完成後,開一個新對話,改動任意一個記憶文件,然後輸入 /clear 結束對話。去 GitHub repo 頁面刷新,看看是否有新的 commit 出現。如果有,說明 Stop Hook 正常工作。
8 FAQ 常見問題
Q Stop Hook 跑備份需要多長時間?會不會很慢?
通常只需要 2-5 秒,你幾乎感覺不到。大部分情況下改動很少(就幾個文字文件),git 處理非常快。只有第一次 clone 可能需要幾分鐘(因為要把整個 repo 都下載下來)。
Q 如果我同時在兩台電腦都在跟 Claude 對話,會不會衝突?
通常不會,因為兩台電腦的 Claude 各自在改不同的文件。就算同時結束對話同時觸發 Stop Hook,先到的那台 push 成功,後到的那台會先 pull --rebase 把對方的改動合并進來,再 push。只有在極罕見的情況下(兩台同時改了同一個文件的同一行),git 才會停下來請你手動解決衝突。
Q 我的記憶文件裡有私人信息,push 到 GitHub 安全嗎?
因為 repo 是設成 Private 的(必須是 private!),只有你自己和你明確授權的人才能看到。不過仍然建議把 OAuth Token 文件、credentials.json 等真正的密鑰文件加入 .gitignore,確保絕對不會上傳。記憶文件本身(用戶偏好、操作教訓等)存在私人 repo 是安全的。
Q Junction 和普通的 Windows 捷徑(.lnk 文件)有什麼不同?
普通捷徑(.lnk)是一個「指向文件的圖標」,程序讀取它時知道這是一個捷徑,需要選擇是否跟隨。Junction 是文件系統層面的重定向,程序根本不知道有 Junction 的存在,它以為自己直接在讀那個目錄——跟真實目錄沒有任何區別。Claude Code 只認識真實路徑,所以必須用 Junction 而不是普通捷徑。
Q Stop Hook 失敗了(比如網絡斷了),記憶文件會丟嗎?
不會丟。記憶文件本身保存在你的本地硬盤上,只是沒有上傳到雲端。失敗只是影響「備份」,不影響「本地使用」。下次網絡恢復後,對話結束時 Stop Hook 會再次觸發,把這次的改動也一起備份上去。另外每天午夜的 RemoteTrigger 也會補漏。
Q 我已經有現有的記憶文件,怎麼遷移到這個系統?
把現有的 .claude/ 目錄內容複製到 Repo 目錄,做初始的 git add + commit + push,然後再建立 Junction 指向 Repo 目錄。兩台電腦都設好後,再各自做一次 git pull,就會都同步到最新狀態。