dsh-repot:用私有仓库搬迁 DSH 环境

前言

在多台机器上使用 DeepSeek Harness(DSH)时,常见做法是手工复制配置、重装插件、再对齐工作目录。会话与任务日志体积大、形态不适合进 Git;凭据也不应写入仓库。若只靠「把整个 .dsh 拷走」,路径一变就容易写错位置,或覆盖本机已有文件。

dsh-repot 由维护者 daoyan2142 提供,归类为 DSH 社区目录中的「记忆」类插件(SkillHub 目录页:daoyan2142/dsh-repot)。它把插件、配置与自选文件夹经一个私有 GitHub / Gitee 仓库在中转机之间搬运;还原时写入必须落在预期路径,否则拒绝执行。插件当前版本为 0.1.1,许可证 MIT(见 GitHub 仓库)。

这是什么

名称「repot」类比换盆:连根士一起移栽。官方描述是:Carry a DSH environment between machines through one private repository: plugins, configuration and folders. Restores land on the expected paths or refuse to write.

它不替代 better-sidebar 的 Git 标签页所管理的提交、分支与图;也不同步会话、任务、本机运行时与缓存。

会搬运什么、不搬运什么

类别 是否搬运 方式摘要
插件(registry 安装) 是 默认只存 name@version,还原时重装;可选携带 tarball
插件(file: 链接源码) 是 源码树进仓库,还原为相对路径 spec
插件(file: 指向 tgz) 是 tarball 原样携带
配置 是 cordis.patch.yml、package.json、pnpm-lock.yaml、pnpm-workspace.yaml
文件夹 是 所选目录快照,带路径锚点
会话 / 任务 否 为 zstd 追加日志,不适合 Git
凭据 否 PAT 只存在本机凭据服务
运行时 否 dsh-runtimes 按机器区分
缓存 否 storages、.plugin-manager/asar-out 可重建

安装与入口

在目标 profile 下安装并重启 DSH:

dsh plugin --profile <your profile> add dsh-repot

也可从市场安装后重启。安装后通常有两个入口:

  • Settings → Environment carry:平台、token、仓库、同步根目录
  • Sidebar → Repot:上传 / 对比 / 应用

未安装 better-sidebar 时,设置页也承载上述操作。

package.json 要求 Node >= 22.12.0;插件在 DSH 进程权限下运行,安装前建议自行查看源码与 MIT 许可证。

首次配置与跨机流程

  1. 创建私有仓库(私有即可),填写 owner/repo 与分支。默认三套内容共用同一仓库;若需拆分(例如插件走 Gitee、文件走 GitHub),在 Per-set repositories 为各集合单独命名仓库,其余留空以继承。
  2. 粘贴 Personal Access Token(不是 DSH 登录密码)。GitHub 需 repo 权限;Gitee 需仓库读写。Token 写入凭据服务,不会经 HTTP 读回。
  3. 注册 sync roots(换机后仍要沿用的路径锚点,最多三个,不能是盘符根目录如 D:\,目录须已存在且根之间不可嵌套):
id path(示例)
work D:\work
plugins C:\Users\you\.dsh\plugins

id 固定;换机时只需把 path 改成本机实际路径。

  1. 在侧栏勾选要携带的内容,点 Upload 写入远程(一次提交)。
  2. 另一台机器:同样安装插件,填写相同仓库与 token,注册 roots,先 Compare 再 Apply。

侧栏三个按钮

按钮 作用 风险
Upload 将选中内容写入仓库 仅改远程
Compare 读远程 manifest,与本机 diff 只读
Apply 写入本机 会改本地文件,需确认

文件夹还原前会弹出预检对话框,列出即将写入的每个绝对路径。

路径为何不漂移

每个文件夹条目记录三项:

absPath   D:/work/notes       源机绝对路径
rootId    work                已注册的 root
relPath   notes               该 root 内的相对路径

还原按序解析:本机存在相同 absPath 则直接用;否则用 rootId + relPath 重定位;两者都不存在则在确认后创建。随后还有四层硬性拒绝(须在注册 root 内、禁止 junction 逃逸、无本插件标记的已有目录不写、内容哈希不一致则拒绝等)。覆盖或删除前会把旧内容备份到 <profile>/.repot/backup/<stamp>/;自上次还原后你改过的文件视为冲突,跳过且不 prune。

对比时文件夹以文件树哈希标识;manifest 记每文件夹一棵树哈希,索引 files/<id>/.repot-index.json 记每文件哈希,列表会显示具体增删改(+ / ~ / −)。

插件的三种存储形态

形态 存储 还原方式
registry 默认 name@version installBundle('name@version')
registry + carry tarball 下载后 installBundle(tgz)
file: 源码 源码树 落到 <profile>/plugins/<name>

超过 20 MB 默认选择重装而非携带 tarball。file:D:/... 在还原时重写为 file:./plugins/<name>。

限制与旧插件关系

  • 不同步会话 / 任务。
  • Gitee 按文件写入,大树集慢,删除不能同提交。
  • 无三方合并:冲突只报告不猜测;需移开本地文件或先还原再 Compare。
  • 文件夹勾选为整夹应用,不能单文件 Apply。
  • Compare 会读盘算哈希,大文件夹 I/O 成本高。
  • 不支持多仓并行、submodule、LFS。
  • 市场要求仓库至少存在一天,新建仓会暂候而非直接拒绝。

dsh-repot 取代 dsh-plugin-git-sync:首次启动会读取 <profile>/.git-sync/settings.json 与 GIT_SYNC_* 凭据并迁移,旧文件保留以便回滚;勿与旧插件同时启用。

适用谁、使用时注意什么

适合需要在办公机与家里机、或多台 Linux / Windows 之间保持同一套 DSH 插件与配置,并把少量工作目录一并迁过去、且要求「写错路径就拒绝」的开发者。

务必记住:插件以当前 DSH 进程权限访问文件与远程 API;PAT 不进设置项、响应体或提交说明;跨域请求经 ctx.connection.requestRejection 拦截。社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。

更多信息见目录页 https://www.skillhub.cn/plugins/daoyan2142/dsh-repot 与源码 https://github.com/daoyan2142/dsh-repot。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye