前言¶
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