趙健的技術筆記

使用 cclayer 在多台電腦之間同步 Claude Code 設定(CLAUDE.md、skills、外掛、MCP),按團隊隔離 git 身分

技術 約 4507 字 · 12 分鐘 - 次閱讀

Claude Code 用久了,~/.claude 底下會累積不少東西:全域的 CLAUDE.md、各種 rules、skills、hooks、settings.json 裡的權限和外掛,還有一堆 MCP server。我平常在好幾台電腦上用 Claude Code,每台都要重新設定一遍,哪台改了點規則,其他電腦也得跟著手動改,時間一久各台的設定就對不上了。

更麻煩的是專案來自不同的團隊。每個團隊的 git 提交身分(使用者名稱、信箱)不一樣,有的團隊還有自己的規則和 hook,這些東西只應該在這個團隊的專案裡生效,不能混進別的專案,更不能把公司信箱提交到自己的開源儲存庫裡。

直接把 ~/.claude 丟進 git 儲存庫也不行:裡面有登入狀態、對話紀錄、本機的權限設定,團隊的東西又不能放進公開儲存庫。所以我寫了 cclayer,專門解決這個問題。

cclayer 是什麼

cclayer 把 Claude Code 的設定拆成兩種「層」:

  • 基礎層:每台電腦都一樣的東西,CLAUDE.md、rules/、skills/、output-styles/、agents/、hook 腳本、settings.json 裡共用的鍵、外掛和 marketplace 清單、MCP 定義。裡面沒有任何身分資訊,可以放公開儲存庫。
  • 覆蓋層:一個團隊一個,放這個團隊的 git 身分、hook、儲存庫網址規則(例如 github.com/acme-inc/*),以及要寫進這些專案的 .claude/settings.local.json 和 CLAUDE.local.md。覆蓋層只在符合的專案裡生效,不往 ~/.claude 寫任何東西。

每台電腦只拉基礎層加上它需要的覆蓋層,cclayer apply 一條指令鋪好,cclayer push 一條指令把本機的改動傳回去。

層可以是 git 儲存庫,也可以直接是雲端硬碟同步資料夾裡的一個目錄,不想碰 git 也能用。

安裝

macOS 用 Homebrew:

Terminal window
brew install --cask zhaojiannet/tap/cclayer

之後升級:

Terminal window
brew upgrade --cask cclayer

Linux 和 Windows 到 Releases 頁面 下載執行檔。需要先裝好 git;外掛、MCP 這幾步需要 Claude Code 2.1.288 以上。

最簡單的用法:一個人,幾台電腦

沒有團隊要分開的話,一個基礎層就夠了。

第一台電腦

Terminal window
cclayer setup

setup 是一個全螢幕的設定介面,左欄是各個層和本機設定,右欄是選中項目的說明和可修改的欄位,按下儲存之前不會寫入任何檔案。介面文字支援簡體中文、英文、日文,預設跟隨系統語言。

cclayer setup 全螢幕設定介面截圖:左欄是基礎層、專案目錄、本機複製位置、自動拉取等設定,右欄是選中項目的說明,底部是儲存並套用、只儲存、離開按鈕

只需要填兩項:

  1. 基礎層:填一個目錄(例如雲端硬碟裡的 ~/Dropbox/cclayer/base)或一個私有 git 儲存庫網址。目錄還不存在的話,儲存時會自動產生起步用的 layer.toml。
  2. 專案目錄:放程式碼的目錄,例如 ~/Projects。

選「儲存並套用」,然後把這台電腦現有的設定收進層裡:

Terminal window
cclayer capture --add CLAUDE.md --add rules/ --add skills/

路徑相對於 ~/.claude。收進去之前每個檔案都會先檢查一遍,像金鑰、信箱、指向本機家目錄的絕對路徑這些會被擋下來,並告訴你在哪一行。只有自己用、層也放在私有的地方時,在 layer.toml 的 [layer] 底下加一行 private = true,就不再擋信箱了。

其他電腦

裝好 cclayer,同樣跑 cclayer setup,基礎層填同一個位址,儲存並套用,第一台電腦的設定就過來了。本機已有、內容又不一樣的檔案會列出來問你要不要覆蓋,覆蓋前舊檔案會備份到 ~/.local/state/cclayer/backups/。

日常同步

用 git 儲存庫當層的話:

Terminal window
cclayer push # 上傳:收集本機改動,列出要提交的內容,確認後提交並推送
cclayer apply --pull # 下載:拉取最新的層,再鋪到本機

用雲端硬碟目錄當層的話,雲端硬碟負責同步,改完跑 cclayer capture,另一台電腦跑 cclayer apply 就可以了。

還可以把下面這個 SessionStart hook 放進基礎層的 claude/settings.json,再在 setup 裡打開「自動拉取」,之後每次開啟 Claude Code 對話都會自動拉取並套用:

{
"hooks": {
"SessionStart": [{
"matcher": "startup",
"hooks": [{ "type": "command", "command": "command -v cclayer >/dev/null && cclayer apply --hook || true" }]
}]
}
}

為不同團隊設定不同的 git 身分

這是我寫 cclayer 的主要原因。先為團隊建一個私有儲存庫,根目錄放一個 layer.toml,寫明身分和要比對的儲存庫:

[layer]
name = "acme"
kind = "overlay"
[identity]
name = "Full Name"
email = "me@acme.example"
[[match]]
remote = "github.com/acme-inc/*"

然後在需要的電腦上加入這個覆蓋層,它會問你怎麼設定儲存庫的存取憑證,再 clone 下來檢查一遍:

Terminal window
cclayer layer add acme git@github.com:you/cclayer-acme.git

apply 之後,cclayer 會在 ~/.gitconfig 結尾加一個 include 區塊,用 git 的 includeIf "hasconfig:remote.*.url:..." 讓這個身分只在遠端網址符合 github.com/acme-inc/* 的儲存庫裡生效,~/.gitconfig 原本的內容一律不動。預設身分(default_identity)留空時,沒有任何覆蓋層符合的儲存庫 git 會拒絕提交,不會再發生用錯信箱提交的情況。

比對規則必須寫明主機和組織,不能用萬用字元代替,免得一個團隊的覆蓋層認領了別的團隊的儲存庫。

如果想讓每個團隊的 Claude Code 登入、對話和提示詞紀錄也完全分開,可以打開 profiles 模式,每個覆蓋層會有自己的 ~/.claude-profiles/<層名> 設定目錄,cclayer env 輸出對應的 CLAUDE_CONFIG_DIR,搭配 direnv 就能進哪個專案用哪套設定。

安全方面的處理

同步過來的 hook、skills 都會在本機被 Claude Code 執行,所以 cclayer 在這方面比較謹慎:

  • hooks、statusLine、enabledPlugins 這類會執行程式或啟用外掛的設定,以及 hooks/、skills/ 底下的檔案、帶執行權限的檔案,寫入前都會先列出內容讓你確認,同一內容確認過一次後不再重複詢問。
  • git 設定片段只放行 pull.rebase、push.default 這類常見設定,alias、core.hooksPath、credential.helper 等能執行程式的鍵,要在裝置清單裡明確信任這個層才行。
  • Claude Code 的登入狀態、history.jsonl、projects/ 不會被讀進層裡,permissions.allow、env 留在本機。
  • 層裡不允許出現符號連結,寫檔案時也不會跟隨符號連結。

常用指令

指令作用
cclayer setup全螢幕設定介面,首次設定和之後修改都用它
cclayer apply把各層鋪到本機,--pull 先拉取
cclayer capture把本機改動寫回層,不提交
cclayer pushcapture 後提交並推送各層儲存庫
cclayer check檢查層裡有沒有不該出現的內容
cclayer status各層的 git 狀態和比對到的專案
cclayer keys setup <層>為本機設定層儲存庫的存取憑證(deploy key 或 HTTPS token)
cclayer layer add <名字> <網址>為本機加入一個覆蓋層
cclayer leave <層>從本機移除一個層,清掉它寫過的東西
cclayer doctor檢查 Claude Code 和 git 的常見問題

更詳細的用法,包括 git 儲存庫的建立方式、私有儲存庫的憑證、常見問題,可以看 cclayer 中文教學。

GitHub 專案網址: https://github.com/zhaojiannet/cclayer

分享:

評論