用 dsh-git-identity 把 DeepSeek Harness 的 git 提交固定成环境自身身份

前言

用 DeepSeek Harness(dsh)跑编码智能体时,会话里的 git commit 多半是 bash 工具代劳的。作者字段看起来只是 user.name / user.email,实际很容易被改掉:某一轮对话里写了 -c user.name="DSH Agent",或者把仓库、全局配置改成占位身份,后面的提交就会一直挂在错误作者名下。GitHub 贡献图对不上、代码评审对不上人,排查时还得回头翻 reflog。

DeepSeek Harness 的设计原则是「一切皆插件」:模型、工具、会话、沙箱和界面都可以在配置层替换,不必改框架源码。官方仓库在 deepseek-ai/deepseek-harness,目前仍是 developer preview。社区目录 deepseek-harness-plugin.com 是独立收录站,和 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。

dsh-git-identity 做的事很窄:在插件加载时解析出「这台环境自己的」git 身份,写入 GIT_AUTHOR_* / GIT_COMMITTER_*,压过后续一切 git config。本文按目录详情页、GitHub README / package.json / index.mjs / cordis.patch.yml,以及官方 Harness 仓库交叉核对后整理。

这是什么

dsh-git-identity 是面向 DeepSeek Harness 的开发与运行时插件,由 LoserFox 维护,仓库为 LoserFox/dsh-git-identity。目录页与 GitHub 仓库简介一致:git 提交固定使用环境自身作者身份,优先 gh CLI 登录账号和 GitHub noreply 邮箱,再用环境变量压过一切 git config。

仓库 package.json 里的 npm 包名是 @loserfox/git-identity,当前版本 0.1.0。它声明了 dsh.bundle.patch,指向 cordis.patch.yml,因此按官方文档属于 profile bundle(README 写明面向 0812 及之后的官方插件系统):装进某个 profile 后,组合层会插入一行 id: git-identity。GitHub 主题标了 dsh-plugin。2026-08-18 查询目录页与 GitHub API,星标均为 7。仓库根目录没有 LICENSE 文件,GitHub API 的 license 字段为空,许可证目前未在仓库中声明。

它解决的不是「帮智能体写更好的 commit message」,而是:DSH 进程内任意路径发起的 git 提交,作者和提交者都落到同一套已解析身份上。

核心功能

用环境变量压过 git config

Git 解析作者身份时,GIT_AUTHOR_NAMEGIT_AUTHOR_EMAILGIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL 的优先级高于 -c user.name=...、仓库本地配置和 git config --global。插件在 apply() 里把解析结果写进当前进程的这四个环境变量。

README 和源码都说明:DSH 的 subprocess 层在启动每个 bash 子进程时会带上 process.env(会剔除凭据)。因此会话里走 bash 工具的 git commit,会继承这组变量。源码注释写明,即便某次会话显式传了 -c user.name=...,环境变量仍然更高,repo-local / global 配置也盖不过去。

身份解析有固定顺序

每个来源必须同时给出 name 与 email,缺一不可。优先级从高到低:

  1. 插件配置 { name, email }:显式钉死,未登录 gh 时也可以用。
  2. gh CLI 登录账号:调用 gh api user,name 取 login,email 拼成 {id}+{login}@users.noreply.github.com
  3. 启动 DSH 时已有的 GIT_AUTHOR_NAME / GIT_AUTHOR_EMAIL。插件会忽略自己上一次注入的值,避免 HMR 重载时把自身输出当成外部输入。
  4. git config --global user.name / user.email 兜底。

全部解析不到时只打告警、不注入,源码和 README 都写了「绝不凭空编造身份」。gh api user 设了 8 秒超时,gh 未安装、未登录或网络异常时快速失败,不拖慢 DSH 启动。

幂等写回 global 配置

进程内注入只覆盖 DSH 子进程。插件还会把同一套身份同步回 git config --global:仅当 global 的 user.name / user.email 缺失,或与解析结果不一致时才写。这样插件进程外的普通终端提交也能对齐。写不进去只告警,不影响已经注入的环境变量。

加载时机是 DSH 每次启动,以及每次 HMR 重载。实现是纯 ESM,index.mjs 零依赖,README 写明改入口文件无需构建。

安装与启用

目录页给出的安装命令以原文为准,在 DeepSeek Harness 终端运行:

dsh plugin add github:LoserFox/dsh-git-identity

如需可复现安装,目录页建议固定 commit 哈希:

dsh plugin add github:LoserFox/dsh-git-identity#commit

commit 换成仓库里实际的提交 SHA。官方文档也用 github:owner/repo 这种 git 源安装 bundle;pnpm 拉到的是源码而不是构建产物。本插件没有构建步骤,但安装时仍可能执行仓库代码。目录页写明:插件以当前 dsh 进程的权限运行,安装前应检查源代码仓库和许可证。

README 补充了按 profile 安装的写法,适合 web / headless 等不同启动组合:

dsh plugin --profile web add /path/to/dsh-git-identity
dsh plugin --profile headless add /path/to/dsh-git-identity

本地 checkout 路径按本机实际情况替换。安装后需要重启目标 profile 的 DSH 进程:README 写明组合层变更不参与 HMR 热更新。验证组合层是否挂上:

dsh --profile web --dump-config | grep git-identity

cordis.patch.yml 插入的行是 id: git-identityname: '@loserfox/git-identity'。能在 dump 结果里看到这一层,说明 bundle 已经进 profile。

典型用法

默认不配 name / email 时,只要本机 gh 已登录,插件会在启动日志里打出类似:

[git-identity] git 提交身份固定为 <login> <<id>+<login>@users.noreply.github.com>(来源:gh CLI 登录账号)

之后 DSH 会话里的 git commit 会带上这组作者。不想依赖 gh、或要钉死公司邮箱时,按 README 在 bundle 的 patch 里给这一行加 config

- insert:
    - id: git-identity
      name: '@loserfox/git-identity'
      config:
        name: LoserFox
        email: 57448027+LoserFox@users.noreply.github.com

上面的 email 是 README 里的示例,对应用户 LoserFox 的 GitHub noreply 地址。换成自己的 name / email 即可。官方文档提醒:后应用的层会整行替换 config,用户侧覆盖应写在 profile 自己的 cordis.patch.yml,不要改包内文件。

解析失败时,日志是:

[git-identity] 无法解析环境自身的 git 身份(需 gh 登录、GIT_AUTHOR_NAME/GIT_AUTHOR_EMAIL 或 git config --global user.name/user.email),跳过注入

这时提交仍走原来的 git 配置,插件不会填一个假作者。

适用场景与注意事项

适合这些情况:

  • 智能体经常代为 git commit / git commit --amend,不希望作者变成 DSH Agent 或某次会话改过的占位名。
  • 同一台机器上 DSH 内提交和普通终端提交要对齐,可以接受插件在必要时写回 git config --global
  • 提交需要落到 GitHub 账号上,希望 email 使用 id+login@users.noreply.github.com 这种 noreply 地址。

使用前要清楚几条边界:

  • 插件以当前 dsh 进程权限运行,安装和加载时会执行 index.mjs。它会调用 gh api user,并可能改本机 git config --global。多用户共用同一套 global 配置、或不希望工具改全局身份时,不要装,或先在插件配置里钉死、再评估写回行为。
  • 仓库未声明许可证。目录页称社区开源、可查看源码并免费安装,但合规场景应自行确认许可条款后再用。
  • 身份来源必须成对出现。只配了 name 或只配了 email,不会采用这条插件配置,会继续往下找 gh / 环境变量 / global。
  • 解析 gh 身份时,显示名用的是 GitHub login,不是 profile 里的 Name 字段。
  • 社区目录不是 DeepSeek 官方应用商店。安装命令以目录页为准;固定 commit、先读源码,比直接追最新 main 更稳。

小结

dsh-git-identity 把「DSH 里的 git 提交该用谁的名字」收成启动时的一次解析:配置、gh CLI、启动环境变量、全局 git 配置按顺序尝试,写成环境变量,必要时再写回 global。它不增加新的 git 工具,也不改 commit 内容,只保证作者字段不再被会话里的临时 -c 或改配置带跑偏。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-git-identity/

GitHub:https://github.com/LoserFox/dsh-git-identity

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

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

小夜