dsh-memory-sync:DSH 啓動時雙向同步 git 記憶目錄

前言

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 掛載時(即一次啓動)依次執行三段:

  1. 本機推送:git pull --rebase --autostash → git add -A → 有改動就提交 → git push;push 被拒時 fetch + rebase 後再試一次。
  2. 對端提交:通過 ssh 在遠端執行一條命令(默認 DSH_SYNC_NAME=cloud /usr/local/bin/dsh-mem-sync),讓對端把它的改動提交併推回同一個裸倉。
  3. 本機拉回:再執行一次同樣的 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜