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
羽毛球分组比赛记分
小程序二维码

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

小夜