前言¶
DSH 的記憶目錄默認在 ~/.dsh/memories。如果一臺機器常開、另一臺筆記本偶爾用,靠手動 git pull / git push 對齊很容易漏;常駐同步進程或 cron 能解決問題,但要長期佔一個進程,關了機器也就停了。
dsh-memory-sync 走第三條路:只在 Harness 啓動時跑一次三段式同步,跑完即退出。下面介紹它的定位、配置和對端準備工作。
這是什麼¶
dsh-memory-sync 由 QIC-9821 維護,在社區插件目錄中歸入「記憶」分類,當前版本 0.1.2,許可證 MIT,要求 Node.js ≥ 22(可用 Harness 自帶運行時)。
它解決的問題是:把一臺常開機器上的 git 記憶目錄共享給另一臺機器,每次打開 DSH 時自動雙向對齊,不需要後臺常駐進程,也不需要 cron。
同步採用三段式:本機先提交推送,再讓對端提交併推回同一個裸倉,最後本機拉回對端的提交。三段都成功纔算一次同步成功。
核心功能¶
- 啓動時自動同步:只在 Harness 進程啓動後 300 秒內掛載時執行;熱重載或開發時重新加載插件不會觸發。
- 雙向對齊:本機和對端各自提交自己的改動,通過同一個 git 裸倉中轉,本機最後一次 pull 拿回對端的提交。
- 失敗自愈:首次失敗 60 秒後重試一次;仍失敗則寫狀態文件、彈系統窗口提醒,之後每 10 分鐘靜默重試,直到成功。
- Agent 可調用
memory_sync工具查詢狀態或立刻觸發一次。 - 只依賴本機
git和ssh,不發起其它網絡請求,不上傳遙測。 - 狀態、日誌、鎖集中在
$DSH_HOME/memory-sync/。
安裝與啓用¶
dsh plugin add dsh-memory-sync
固定版本或從源碼目錄安裝:
dsh plugin add github:QIC-9821/dsh-memory-sync#v0.1.1
dsh plugin add /absolute/path/to/dsh-memory-sync
安裝後在 Harness 設置裏找到「啓動時同步記憶」填寫配置,也可以直接寫在 profile 的插槽裏:
- id: dsh-memory-sync
name: 'dsh-memory-sync'
config:
repoPath: '' # 留空 = $DSH_HOME/memories
remote: cloud
branch: main
mode: peer
peerHost: 203.0.113.10
peerUser: dsh
peerKeyPath: C:/Users/me/.ssh/id_ed25519
常用配置項:
| 鍵 | 默認 | 說明 |
|---|---|---|
repoPath |
$DSH_HOME/memories |
要同步的 git 工作目錄 |
remote |
cloud |
git remote 名;不存在時依次嘗試 origin、cloud |
branch |
main |
分支名 |
enabled |
true |
總開關 |
runOnStartup |
true |
啓動時自動跑 |
startupGraceSec |
300 |
啓動後多少秒內掛載纔算「啓動」;超過視爲熱重載 |
mode |
peer |
peer = 三段式;local = 只在本機 pull/commit/push |
peerHost / peerUser |
空 | ssh 目標 |
peerKeyPath |
空 | 私鑰路徑;空 = 用 ssh 默認密鑰 |
peerCommand |
/usr/local/bin/dsh-mem-sync |
對端執行的同步腳本 |
peerEnvName |
cloud |
執行時設置的 DSH_SYNC_NAME |
retryDelaySec |
60 |
啓動失敗後第一次重試間隔;0 關閉 |
healIntervalSec |
600 |
失敗後靜默自愈間隔;0 關閉 |
notifyOnFailure |
true |
失敗彈系統窗口 |
commitPrefix |
sync |
自動提交信息前綴 |
gitPath |
git |
git 可執行文件 |
localTimeoutMs / peerTimeoutMs |
120000 |
單段超時 |
statusFile |
空 | 每次同步前寫一份機器快照到該文件(如 ~/.dsh/memories/pc-status.md),隨同步一起提交;空 = 不寫 |
工作方式¶
插件在 Harness 掛載時(即一次啓動)依次執行三段:
- 本機推送:
git pull --rebase --autostash→git add -A→ 有改動就提交 →git push;push 被拒時 fetch + rebase 後再試一次。 - 對端提交:通過 ssh 在遠端執行一條命令(默認
DSH_SYNC_NAME=cloud /usr/local/bin/dsh-mem-sync),讓對端把它的改動提交併推回同一個裸倉。 - 本機拉回:再執行一次同樣的 pull/commit/push,拿到對端剛推上來的提交。
把 mode 設爲 local 時只在本機做 pull/commit/push,跳過對端。
典型用法:對端準備¶
對端只需要一個裸倉和一條能提交的同步命令,例如:
# 裸倉
git init --bare -b main /srv/dsh-memory.git
chown -R dsh:dsh /srv/dsh-memory.git
git --git-dir=/srv/dsh-memory.git symbolic-ref HEAD refs/heads/main
# 對端工作副本(/home/dsh/.dsh/memories)的 remote 指向裸倉
git -C /home/dsh/.dsh/memories remote add origin /srv/dsh-memory.git
# /usr/local/bin/dsh-mem-sync:pull --rebase --autostash → add/commit → push
chmod 755 /usr/local/bin/dsh-mem-sync
把本機的 ssh 公鑰加到對端用戶的 ~/.ssh/authorized_keys,本機 remote 用 ssh://dsh@host/srv/dsh-memory.git。插件只負責「啓動時按順序跑」,不理解倉庫佈局。
工具與狀態查詢¶
Agent 內可調用 memory_sync:
{"action":"run"}:立刻同步一次,返回三段的 exit / 耗時 / HEAD。{"action":"status"}:上次結果、HEAD、dirty、ahead/behind、peer 是否配置。
運行產物都在 $DSH_HOME/memory-sync/:last-run.json、sync.log、lock/sync.lock。
適用場景與注意¶
適合:一臺常開服務器(或家用機器)加一臺筆記本共享記憶目錄,希望開機即對齊、不想維護常駐進程。
注意:
- 插件以當前 DSH 進程的權限運行,安裝前應檢查源碼與許可證(MIT)。
- 插件會把
repoPath裏的全部內容提交併推送,statusFile生成的機器快照也會進入倉庫;同步到公開倉庫前請自行確認內容。 - 失敗彈窗只包含出錯的階段和 git/ssh 報錯,不含倉庫文件內容。
- 安全漏洞請走倉庫 SECURITY.md 裏的私密渠道,不要開公開 issue。
結語¶
dsh-memory-sync 把「記憶目錄多機對齊」收斂成一次啓動時按順序跑的操作:沒有額外常駐負擔,失敗有明確的重試、告警和靜默自愈路徑,狀態日誌可查。
- 目錄頁:https://www.skillhub.cn/plugins/QIC-9821/dsh-memory-sync
- GitHub:https://github.com/QIC-9821/dsh-memory-sync