前言¶
在 DeepSeek Harness(DSH)里让模型操作 Git,常见做法是依赖文件沙箱内的 shell 或 bash 工具。实测表明:沙箱内本地读写(如 git init、git add、git commit)往往可以完成,但涉及 TLS 凭证、凭据助手或 MSYS2 自带的 ssh.exe 时,会在进程级限制下失败;Windows 上交互式 bash 与 ACL 沙箱还会叠加 PTY、signal pipe 等问题。结果是「能改工作区,难做 push / fetch」。
git-for-dsh 是维护者 theRMM714 发布的 DSH 客户端插件(GitHub:theRMM714/git-for-dsh)。它不继续把 Git 关在文件沙箱里,而是显式以 sandboxPolicy: { mode: 'danger-full-access' } 调用 ctx.shell 执行一次性 git 命令,安全边界改由用户勾选的子命令允许清单和多道闸门承担。README 开头注明:这是个人测试用项目,使用出现任何问题作者不承担责任;安装前应自行阅读源码与 MIT 许可证。
这是什么¶
插件由两半组成,装一次即可:
- Host 半(
src/index.js):向模型注册工具git_exec,并实现允许清单、参数闸门、配置写入闸门、仓库配置审计与执行环境硬化。 - Client 半(
src/client.js):在「设置 → Git 工具」渲染勾选页,用户决定放行哪些 git 子命令;勾选结果持久化到 Profile 的cordis.patch.yml。
当前 package 版本为 0.0.9(以仓库 package.json 为准)。社区目录页:SkillHub - git-for-dsh(独立站点,与 DeepSeek / 幻方无官方从属关系)。
核心功能¶
模型工具 git_exec¶
| 参数 | 必填 | 含义 |
|---|---|---|
argv |
是 | 程序名之后的 git 参数,首元素为子命令,例如 ["log", "--oneline", "-n", "20"] |
paths |
否 | 涉及的文件或目录;插件拼成 git <子命令> … -- <路径> |
description |
是 | 一句话说明用途,显示在界面 |
workdir |
否 | 工作目录;默认会话工作区 |
timeoutMs |
否 | 超时毫秒;本地默认 120000,触及远端默认 300000 |
justification |
否 | 需要审批时的一句话理由 |
返回字段包括 exitCode、signal、timedOut、operation、command、stdout、stderr。路径应放在 paths,不要塞进 argv,以避免空格、通配符等转义问题。工具描述与系统提示会根据当前允许清单实时生成。
命令经 host 的 shell 解析(Linux/macOS 为 bash,Windows 为 pwsh);参数一律用单引号包裹,插件按平台处理含单引号或逗号的参数。
三道风险档位与 47 个子命令¶
src/git-catalog.js 为唯一事实来源,操作分三档:
| 档位 | 含义 | 操作数 | 默认 |
|---|---|---|---|
read |
只读仓库、索引、引用与配置 | 22 | 开启 |
write |
改动工作区、暂存区或本地分支 | 16 | 关闭 |
remote |
克隆、推送,或永久丢弃历史与未跟踪文件 | 9 | 关闭 |
未勾选的子命令在进程启动前拒绝,模型看到的是「该操作未启用」。部分子命令(如 branch、tag、remote)存在「形式上是只读、实际会写状态」的分支,变更形式按写档处理或按规则直接拒绝(例如 remote set-url、config 写入)。
五道闸门(摘要)¶
- 允许清单:仅用户勾选的子命令可启动进程。
- 参数闸门:拒绝全局位置的
-c、--git-dir、--exec等;-u按子命令区分(如fetch上为--upload-pack短形式则拒绝)。 - 配置不能变成程序:限制
config写入;通过环境变量钉死core.fsmonitor、credential.helper等;diff类命令强制--no-ext-diff --no-textconv。 - 仓库配置审计:执行前用
git config --local --includes --list --name-only -z检查危险键;策略可在设置页选择(默认refuse-repo等)。 - 执行环境硬化:与上述项配合,README 中另有验证脚本说明。
安装与启用¶
本包自带 dsh.bundle.patch(cordis.patch.yml),安装后并入 profile 的 bundle 层栈,无需手改配置文件。
# 从 npm(发布后)
dsh plugin --profile <profile> add git-for-dsh
# 或直接从 GitHub(lib/ 已入库,无需构建放行)
dsh plugin --profile <profile> add github:theRMM714/git-for-dsh
# 或本地路径(开发:link 为符号链接,改完即生效)
dsh plugin --profile <profile> add /path/to/git-for-dsh
更新:
dsh plugin --profile <profile> update git-for-dsh
从 GitHub 安装或更新时,shell 需能访问 github.com;若需代理,可先设置 HTTPS_PROXY。
安装后重启 Profile:模型获得 git_exec;设置中出现「Git 工具」页。环境变量 DSH_GIT_TOOL_DISABLED=1 时,cordis.patch.yml 中 tool-git 条目不加载,便于快速停用插件而不改文件。
若在 profile 自有 cordis.patch.yml 中重述同一 id: tool-git,用户层按行覆盖。设置页底部有「页面版本」构建指纹;与 lib/client.js 不一致时强制刷新浏览器即可。
典型用法¶
下面是一条只读查看最近提交的可复现调用形态(子命令须在设置中勾选 log):
模型调用 git_exec,例如:
argv:["log", "--oneline", "-n", "20"]description: 查看最近 20 条单行日志- 可选
workdir指向仓库根目录
写操作、远端操作默认未勾选;启用后部分写档命令会走审批流程(见 README 中「形式风险」与闸门说明)。推送、拉取等需在「Git 工具」中显式开启 remote 档相应子命令,并理解命令以当前 DSH 进程的用户权限在沙箱外执行。
适用场景与注意¶
适合:需要在 DSH 会话里让模型执行受控 Git 工作流(含远端),且愿意用勾选清单代替「完全沙箱内 git」的开发者。
务必注意:
- 每次
git_exec等价于在本机以 dsh 进程权限运行 git,不是文件沙箱内的受限调用。 - README 免责声明:个人测试项目;安装前检查源码、闸门逻辑与 MIT 许可证。
- 对不可信仓库,不要随意将仓库配置审计设为
off;默认策略意在阻止.git/config与 include 中的危险键间接执行程序。 - Windows 上插件走
ctx.shell一次性命令与danger-full-access,不依赖交互式 PTY;仍应用设置页控制写档与远端档。
结尾¶
git-for-dsh 把「AI 能用哪些 git 子命令」做成可持久化的允许清单,并把执行放到沙箱外、由多道闸门约束参数与仓库配置,以弥补沙箱内 git 做不了远端与凭证相关操作的问题。目录与源码: