Back to home@valkia

dsh-plugin-git-log

Git Log commit graph and history workbench for DeepSeek Harness

Stars
0
Language
JavaScript
Created
Aug 24, 2026
Updated
Aug 24, 2026

Introduction

dsh-git-log

DeepSeek Harness web 客户端打造的 Git 提交图 / 历史工作台插件,移植自 ascenx/vscode-git-log(MIT)。

screenshot

功能

  • 多仓库工作台:支持 repoPaths 白名单和默认开启的有界自动发现;识别 .git 目录/文件和 Bare Repository,支持 repositoryExcludes Glob;同名仓库使用最短唯一父路径消歧,切换会隔离分页、Graph、过滤、选择及文件工作区状态
  • 仓库边界状态:Bare Repository 可浏览完整历史但全部变更操作只读;Linked Worktree、Detached HEAD 与 Unborn Branch 分别显示状态 Badge;Unborn 安全返回空 Log 与 synthetic HEAD/main,初始提交前禁用 Push
  • 仓库生命周期恢复:手动 Refresh 原子重扫,Host fs.watch 事件发现运行时新增与删除;当前仓库消失时安全回退到首个可用仓库,全部消失时清空旧页面并保留 Retry,路径重新出现后可直接恢复;未知 ID 仍按未授权请求拒绝
  • 自动仓库刷新:Host 使用 fs.watch 监听工作区与 Git 元数据,通过同源 GET /gitlog/events SSE 推送外部 Commit/Checkout/Fetch/Index/Operation 与仓库增删事件;事件立即失效缓存并原子刷新,隐藏页合并事件、恢复可见时刷新;仅保留 5 分钟低频恢复扫描以覆盖不支持递归监听或丢失事件的平台
  • 三栏工作台:左侧 HEAD / Local / Remote / Tags 树、中间提交表格、右侧 Changed Files Tree/List,并在底部常驻提交详情
  • 过滤器:支持 200ms 实时 Text/Hash 搜索,以及 Branch / User / Date / Paths 弹窗、活动计数和一键重置;左侧 ref 与分支过滤同步
  • Commit Graph:虚拟化提交表格(Commit / Author / Date / Refs)使用 SVG 绘制 lane 连线图,近底自动加载并跨页延续泳道和颜色
  • 提交选择:支持单选、Ctrl/Cmd 多选、Shift 连续范围、方向键、PageUp/PageDown、Home/End 和键盘复制 Hash;多选时聚合 Changed Files
  • Workspace 状态持久化:按 Canonical Workspace Root 的 SHA-256 Opaque ID 隔离 Refs / Changed Files / Details / History 面板尺寸、提交列、折叠状态、Tree/List、Split/Unified;按 Workspace + Repository 隔离 Filters、Active Ref、Log Offset、Graph Continuation、Scroll Anchor 和 Selected Commit,重载后恢复 Commit Details
  • Git 操作:全局 Fetch/Pull/Push,以及提交 Checkout、分支/标签创建、Cherry-pick、Revert、Merge、Rebase、Soft/Mixed/Hard Reset;参数由 host 严格校验;Hard Reset、Force Push、删除、历史重写、Amend 与破坏性恢复操作由 host 强制二次确认并绑定状态快照
  • 上下文菜单:Commit、HEAD、Local/Remote/Tag Ref、Changed File 菜单按上游顺序和分组呈现;支持视口约束、键盘导航、typeahead、焦点恢复及复制动作,禁用项通过 tooltip 与 ARIA label 说明原因
  • Modal 无障碍:所有确认、输入、选择和 Workspace Dialog 共用 Focus Trap、Escape、背景 inert 和关闭后焦点恢复;嵌套 Dialog 恢复到明确的触发按钮
  • 全局工具栏:提供 Open File、Refresh、Go to HEAD、Fetch、Stash、Refs Pane、Files Pane 与 More;Go to HEAD 精确选择 HEAD,保留全部过滤器,在 HEAD 不属于过滤结果时仍加载详情而不假设首行
  • Ref 状态同步:Branch Rename 自动迁移活动过滤器与 Active Ref;Branch/Tag/Remote Delete 自动移除失效过滤器并回退 HEAD,避免操作后空白日志
  • Stash:支持创建(可含 untracked)、列表、Apply、Pop、Drop;Drop 由 host 强制二次确认;列表查询失败会显示内联错误和全局诊断,不再伪装成空 Stash 列表
  • Merge Parent:合并提交可切换 Parent 1/2…,Changed Files 与完整文件 Patch 同步按选定父提交计算
  • 独立 Diff 工作区:双击、Enter 或文件菜单打开;支持 Split/Unified、完整上下文、双栏行号、增删块对齐、模式持久化与 Escape 关闭;Patch 同时受 8 MiB 和 50,000 行上限保护;两种模式保留增删背景,并由独立 Shiki Worker 按 GitHub Light/Dark 主题和文件 Grammar 着色
  • 文件类型视觉:Changed Files、Comparison、Diff 与 File Viewer 共享扩展名图标映射(JS/TS/JSON/Markdown/CSS/Markup/Image/YAML/Shell/Python),目录显示独立 Folder glyph
  • 上游式文件历史:从 Changed File 菜单进入,采用可调整宽度的 Commit List + Inline Diff 同屏工作区;按 Repository/HEAD/Path 维护最多 20 个 LRU 缓存并使用 per-key 异步锁串行共享扫描;支持 --follow Rename、准确分页、Ref/统计/Binary 元数据、Merge Parent、Split/Unified 持久化与 Previous/Next Change 导航
  • 上游式行历史:对工作区选区映射 HEAD 行范围,复用同屏 History Workspace;未保存的内存快照直接参与映射且不写磁盘;Selection 默认 Content Only,只显示 git log -L 返回的行范围 Patch,而不是整文件 Commit Diff
  • Commit/Ref Comparison:Ref 与提交菜单支持 Compare with Current / Parent,Current File 未保存快照可直接与 Ref 比较且不会写入磁盘;比较工作区复用可折叠 Tree/List Changed Files,右侧直接显示 Split/Unified Diff;Binary 文件显式禁用文本 Diff 操作,失败支持 Retry / Copy Diagnostic
  • Details 导航:Parent Hash 可直接加载父提交(即使不在当前 Commit Window),每个 Parent 提供独立 Compare 动作;Ref Badge 可点击并同步 Ref Tree、Branch Filter 与日志窗口
  • Commit Signature:解析 Good/Bad/Unknown/Expired/Revoked/Error/Unsigned,并显示 Signer、Key、Fingerprint、Primary Fingerprint 与 Trust;Badge 提供状态图标、ARIA label 和完整 Tooltip
  • Open File 等价能力:支持 Open File at Revision 与 Open Current File,提供行号、revision 标识、缺失/二进制/超限提示、默认 5 MB 可配置限制及仓库路径/符号链接越界防护;内存编辑草稿在 History 返回后恢复,关闭时必须显式确认丢弃
  • 任意 Repository File 入口:工具栏 Open File 可搜索最多 50,000 个 tracked/untracked 文件,支持键盘 Listbox、Current File、File History、指定行 Line History 与 Blame;保留已删除 tracked 文件,排除 .gitignore 命中的 untracked 文件,并支持 Bare Repository 的 HEAD Tree
  • 历史重写:HEAD Amend、连续多选 Drop/Squash;Host 要求 2–100 个唯一提交、当前分支 first-parent 连续范围、clean worktree、无 merge 跨越且不能包含 root;确认挑战绑定 Branch/HEAD/Range/Base 快照,执行前重新规划并再次校验 Branch、HEAD 与 Worktree
  • 冲突恢复:检测 Rebase/Merge/Cherry-pick/Revert 状态;工具栏状态按钮提供严格映射的 Continue、Skip、Abort,Continue 禁用编辑器交互,Skip/Abort 强制危险确认;未合并分支普通删除失败后提供 Force Delete 恢复确认
  • Git RunnergitPath(兼容 git.path)可指定 Git Executable;始终 shell:false,stdout/stderr 分别有界;同类浏览器读取请求采用 latest-wins 并主动 Abort,HTTP 断开通过 AsyncLocalStorage 贯穿所有 Git 子查询;超时/取消/输出超限时终止整个进程组并在 1 秒后升级 SIGKILL,Mutation 请求不参与自动替代取消
  • Git 环境诊断:首次 API 初始化时要求 Git 2.27+ 并返回解析后的版本;错误按 Environment/Version/Timeout/Output Limit/Lock/Authentication/Permission/Hook/Conflict/Repository/Binary 分类,URL 凭据、Repository 路径与绝对 Git Executable 路径自动脱敏,可恢复错误提供指导和 Retry
  • 远程与分支操作:Remote Checkout as New Local、Rename Branch,以及按 branch.pushRemote / remote.pushDefault / upstream / push.default / refspec 严格解析的 Force Push with Lease;Remote Delete 要求目标存在于最新 Ref Snapshot,并在确认前后复核 Remote、Branch Format、Tracking Ref 与对象 Hash
  • Stash Comparison:Stash 管理器支持 Show Changes,以 Stash 第一父级为基线打开多文件 Comparison,并继续进入逐文件 Diff
  • Line History:Current File 查看器可直接选取一行或范围;先通过 git diff HEAD 将 Working Tree 行号映射回已提交范围,再调用 git log -L;区分纯未提交、部分未提交、非连续选择和 File-not-in-HEAD,并支持 500 条上限、父级 Diff、切换 File History 和返回 Git Log;Patch Header 的 Git C-quoted 路径完整解码转义字符及八进制 UTF-8
  • Current-Line Blame:Current File 活动行尾内联显示作者、相对时间与主题;选择行采用 150ms 调度,内存编辑采用 300ms 调度和 2 MiB 上限,未提交行使用 Git 用户身份与逐分钟更新时间,无 HEAD、新文件、普通/编辑后/大小写 Rename 均按上游恢复;配置 currentLineBlame.enabled: false 可关闭
  • Blame 工作区:Current File 一键进入 Blame;按连续提交分组显示行号、Hash、作者、相对时间与内容,点击行加载完整提交详情,支持 Escape 返回
  • 树无障碍:Refs 与 Changed Files Tree 使用 tree/treeitem/grouparia-level/expanded/selected,支持 Up/Down/Home/End、Left/Right 折叠导航与 typeahead;Ref Search 匹配 short/full/remote/upstream 名称并临时强制展开分组和目录,清空后恢复原折叠状态
  • 有界 Commit Window:按上游默认最多缓存 5000 条提交;继续分页时裁剪最早窗口、推进全局 offset 与 Graph continuation,并按裁剪行数修正滚动锚点,保留仍可见的选中提交
  • 每仓库导航恢复:按 Repository 持久化过滤器、Active Ref、滚动位置、全局 Log Offset 与 Graph continuation;仓库切换或页面刷新后按可见范围恢复窗口,而非从 HEAD 重载全部历史
  • 提交详情:查看作者、提交者、完整 Hash、签名、父提交、Refs,以及 A/M/D/R 文件状态和增删行数
  • Diff 查看:点击变更文件渲染 unified patch(+/− 着色)
  • File History:输入仓库相对路径,git log --follow -M --numstat 单遍扫描该文件的提交序列与逐次增删
  • Blamegit blame --porcelain 逐行标注作者与时间

架构

src/
  host/
    git.js       git 数据层(自 vscode-git-log 移植:runner/parsers/logQuery/blame)
    server.js    Same-origin API 处理器 + Host confirmation token
    routes.js    DSH webServer 路由适配(POST /gitlog/<method>)
    plugin.js    Cordis 插件入口(apply/inject)
  client/
    main.js      客户端入口(传输层 + slots 注册)
    ui.js        React 组件(createElement,无 JSX):提交图/详情/PatchView/文件历史/blame
  shared/
    graph.js     layoutCommitGraph 图布局算法(原版移植)
build/build.mjs  esbuild 构建:lib/index.js(ESM host 包)+ lib/client.js(__ModuleLoader__ 工厂经典脚本)

数据通路:浏览器 → 同源 POST /gitlog/<method>(由宿主插件的 webServer.register 挂载)→ Git 子进程。插件不启动或探测跨域 loopback sidecar;危险操作必须使用 Host 签发、绑定 Repository 与 Operation、60 秒失效且一次性的 confirmation token。

安装到 web profile

# 从 GitHub 获取并构建
git clone https://github.com/valkia/dsh-plugin-git-log.git
cd dsh-plugin-git-log
pnpm install --frozen-lockfile
pnpm run build

# 安装到 DSH web profile;开发期也可以使用 link:/path/to/dsh-plugin-git-log
cd ~/.dsh/profiles/web
dsh plugin --profile web add "link:/path/to/dsh-plugin-git-log"

~/.dsh/profiles/web/cordis.patch.yml 加入 loader entry:

- insert:
    - id: dsh-git-log
      name: dsh-git-log
      config:
        repoPath: /path/to/your/repo   # 缺省用 host 进程 cwd;也可用环境变量 DSH_GIT_LOG_REPO
        gitPath: git                    # 可选 Git executable 路径;默认从 PATH 使用 git
        discoverRepositories: true      # 默认开启;运行时扫描新增/删除的 nested 与 bare repositories
        repositoryDiscoveryDepth: 2     # 0–8
        repositoryExcludes:             # Git 风格 * / ** / ? 路径规则
          - "**/node_modules/**"
          - "**/.worktrees/**"
        repoPaths:                      # 可选的额外仓库白名单
          - /path/to/another/repo
        currentLineBlame:
          enabled: true                 # 默认开启
        initialPageSize: 200            # 20–2000
        pageSize: 500                   # 20–5000
        maxCachedCommits: 5000          # 200–50000
        maxDiffFileBytes: 5242880       # 1024–104857600,默认 5 MB

保存后热加载(若 watcher 未生效则重启一次 dsh web),刷新页面并打开任意会话,点击会话页头中 对话 / 轨迹 右侧的 Git Log 标签。

注意:修改 package.json 的 name/exports 后,host 对包元数据有按名负缓存,需换名或重启 host 才会重新识别。

开发

pnpm install
pnpm run build     # 产出 lib/index.js + lib/client.js + lib/syntax-worker.js
pnpm test
pnpm run test:browser  # 自建临时 Git/DSH fixture,验证当前构建产物

Client Plugin 只有在 DSH checkout 同时运行 pnpm run dev:web 重建 Bundle 时才能由 HMR 自动替换;其他 Web Shell / Host 改动需重新构建相应产物,并刷新现有 DSH GUI 或重载 Plugin Entry。

上游对齐状态

已验证能力、DSH 原生替代方案和最终独立审计结果记录在 docs/upstream-parity.md。当前审计未发现实质性上游对齐阻塞项。