用 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

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

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

小夜