跳到主内容

dsh-git-graph 使用指南

为 dsh web GUI 空白会话加一个工作区分支选择胶囊与 Git 图谱面板:搜分支、切换、新建分支、查看泳道提交图,git 操作在 host 端执行。

本文为派生内容(基于 wiki / faq / compatibility_json 自动组装),非 AI 即时创作。

本文由本站基于该插件已收录的字段自动派生(wiki / faq / compatibility_json / readme),非 AI 即时创作。每节末尾标源字段。

快速上手

dsh-git-graph

— 源: plugin_wiki.wiki_content

安装与验证

dsh plugin --profile web add @linxin666/dsh-client-ui-git-graph

复制以上命令在 DSH Web Profile 内运行。安装完成后在「插件列表」启用即可。

— 源: plugins.install

关键要点

  • Web 终端:xterm.js 远程终端,实时输出,窗口大小自适应;
  • 文件传输:SFTP 上传 / 下载,有进度条,能浏览远程目录;
  • 端口转发:本地隧道直连远程内网服务(数据库、API、管理后台),只监听 127.0.0.1;
  • 集群执行:一条命令并发跑多台主机,按别名 / 环境 / 标签过滤;
  • Agent 直连:Agent 和面板共用同一份主机配置,对话里说一句「连一下 xxx 看看状态」,智能体就去执行远程命令。

— 源: plugin_wiki.readme_zh (fallback readme_raw)

常见问题

这个插件能做什么?

在新建会话时的输入区右侧提供一个工作区分支胶囊:点开可搜索本地分支、查看当前 HEAD、创建并切到新分支、打开 Git 图谱面板看泳道式提交历史。会话开始对话后该控件自动隐藏。切换分支会作用于整个工作区磁盘树,所有会话共享一份 checkout。packages/dsh-git-graph/README.zh.md:5-7 / packages/dsh-git-graph/src/client/index.ts:101-199 / packages/dsh-git-graph/src/host/git-service.ts:204-225。

切分支会被什么情况挡住?

三类守卫:未解决的合并冲突、正在进行的 git 操作(merge / rebase / cherry-pick / revert / bisect 任一标记存在)、目标分支已被其他 worktree 检出。任何一条命中就直接拒绝并给出可读报错(不会偷偷强切),代码在 packages/dsh-git-graph/src/host/git-service.ts:323-340。

切分支时本地修改会丢吗?

不会自动 stash;本插件走 git switch --no-guess,会由 git 自己拦截会覆盖的修改。落点有:已跟踪的本地修改会被覆盖(给出 tracked-changes-would-be-overwritten 错误,列出前两个阻塞文件路径 + 其余文件计数)、未跟踪文件会被覆盖(untracked-changes-would-be-overwritten)。错误在 packages/dsh-git-graph/src/host/git-service.ts:87-100、134-152 与客户端 packages/dsh-git-graph/src/client/locales.ts:30-35 翻译。

局域网里别人能访问我的分支面板吗?

不能。/git/* 路由只信任本机回环(loopback socket + loopback Host + sec-fetch-site),LAN 邻居直接 403;同时安装了 dsh-remote-web-ui 时,已配对设备的 cookie 才能作为额外放行路径。访问限制代码在 packages/dsh-git-graph/src/host/access.ts:28-34、packages/dsh-git-graph/src/host/loopback.ts:44-62。

多标签页打开会拖垮连接池吗?

不会。SSE 推送走跨标签页选主中继(Web Locks + BroadcastChannel),同一 URL 全浏览器只保留一条 EventSource,别的标签页通过 BroadcastChannel 收事件,HTTP/1.1 同源连接池不被挤占。代码在 packages/dsh-git-graph/src/client/sse-leader.ts:45-122(对应 issue #383)。

切换后多久看到新状态?

三种刷新路径叠加:胶囊挂载时拉一次、弹层打开拉一次、切换成功拉一次;订阅期间 host 端每 30 秒轮询一次 git status、有变化才推(每次探测有 15 秒超时兜底);浏览器窗口聚焦时再触发一次(5 秒节流)。轮询常量在 packages/dsh-git-graph/src/host/routes.ts:49-58。

对分支名有什么限制?

创建分支时会先用一份纯客户端校验(不允许以 - 开头、不含 .. / ~^:?*[\ 等、不以 .lock 结尾、不能含空格、控制字符、长 1000),再交给 host 跑 git check-ref-format --branch 做权威校验;重复名直接以 branch-already-exists 拒掉。客户端校验在 packages/dsh-git-graph/src/core/git-command.ts:161-183,host 双重校验在 packages/dsh-git-graph/src/host/git-service.ts:234-257。

在非 Git 仓库里会怎样?

胶囊自动隐藏,host 端 git rev-parse --show-toplevel 失败时 RepoStatus 返回 null,前端拿 null 后不渲染控件;不会报错、不会占用屏幕。空状态判定在 packages/dsh-git-graph/src/host/git-service.ts:281-286、客户端 packages/dsh-git-graph/src/client/index.ts:134-138。

卸载会留下残留吗?

不写持久文件。分支切换走磁盘 git switch,状态全部由 git 自己管理;本插件没有自己的数据库或设置项,卸载 dsh plugin --profile web remove 后不会有插件自留的状态。卸载命令见 packages/dsh-git-graph/README.zh.md:65-67。

— 源: plugin_wiki.faq_json

兼容性

  • DSH: 未声明(package.json 无 dsh.engines;通过 devDependencies 锁到 @deepseek-ai/dsh-* ^0.1.0-rc.8,详见 packages/dsh-git-graph/package.json:60-70;已知宿主 CLI 为 0.1.0-rc.7/rc.8)
  • Node: ^22.19.0 || >=24.0.0(packages/dsh-git-graph/package.json:7-9)

— 源: plugin_wiki.compatibility_json

踩坑提醒

安装前请审阅上游仓库;本指南基于已收录字段自动派生,可能滞后于最新版本。如发现与官方文档冲突,请以上游为准。

— 来源:通用规则