前言¶
用 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_NAME、GIT_AUTHOR_EMAIL、GIT_COMMITTER_NAME、GIT_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,缺一不可。优先级从高到低:
- 插件配置
{ name, email }:显式钉死,未登录 gh 时也可以用。 - gh CLI 登录账号:调用
gh api user,name 取login,email 拼成{id}+{login}@users.noreply.github.com。 - 启动 DSH 时已有的
GIT_AUTHOR_NAME/GIT_AUTHOR_EMAIL。插件会忽略自己上一次注入的值,避免 HMR 重载时把自身输出当成外部输入。 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-identity、name: '@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