@moritzwilksch/diffle

中文文档
0.3.6发布于 2026/11/02Apache-2.0ES Module零依赖构建来源已验证

浏览器中的本地git diff审阅器,将行注释导出为代理提示

中文使用文档
文档目录12 节
  1. 安装
  2. 选择要回顾的内容
  3. 审查
  4. 发送评论到GitHub
  5. 跳转到定义
  6. 以图表的形式查看变化
  7. 从懒惰开始
  8. 壳完成
  9. 在反向代理的背后
  10. 在远程机器上
  11. 开发
  12. 致谢

diffle

CI conda-forge conda-forge-platforms npm website

在浏览器中查看Git差异,并对行、块或整个文件进行注释。然后把 将评论作为提示发送给代理,或将评论作为待审核内容发送给GitHub。

A review in diffle: a language-server hover, its references, a jump to one and a comment there, then yy copies the comments as one prompt

安装

brew install diffle                      # Homebrew
pixi global install diffle               # conda-forge
npm install -g @moritzwilksch/diffle     # npm
cargo binstall diffle                    # crates.io, the release binary
cargo install diffle                     # crates.io, compiled from source

或者获取独立二进制文件。在Linux (x64, arm64, glibc)和Apple silicon macOS上:

curl -fsSL https://diffle.app/install.sh | sh

它安装为 ~/.local/bin. 集 DIFFLE_INSTALL_DIR 改变它,或者 DIFFLE_VERSION=v0.4.0 固定一个释放器。在Windows (x64, arm64)上,从PowerShell:

irm https://diffle.app/install.ps1 | iex

它安装为 %LOCALAPPDATA%\Programs\diffle 并将其添加到用户PATH;集 DIFFLE_NO_MODIFY_PATH 保持PATH的原样。

要在不安装的情况下尝试:

npx @moritzwilksch/diffle working
pixi exec diffle working
nix run github:moritzwilksch/diffle -- working

Nix包包 gh; #minimal 放下它,然后 #web, #rust, #python, #csharp 包 语言的服务器。每个包裹都带着更多的东西 withLsps, #unwrapped 是裸二进制文件:

diffle.packages.${system}.default.withLsps [ pkgs.gopls pkgs.clang-tools ]

为了从源代码构建,pixi使用 recipe/recipe.yaml (一个Rust工具链和 Node.js来自conda-forge):

pixi global install --git https://github.com/moritzwilksch/diffle diffle

选择要回顾的内容

diffle                  # HEAD vs worktree, like a bare `git diff`
diffle working          # HEAD vs worktree: staged, unstaged, untracked
diffle develop          # what this branch added since it left develop
diffle pr 27            # GitHub PR 27, or its URL; without a number, this branch's PR
diffle show a1b2c3d     # one commit, like `git show`
diffle main..feat       # any git-diff revspec: <rev> | a..b | a...b | a b
diffle main..worktree   # "worktree" names the uncommitted tree on either side
diffle range-diff main..v1 main..v2   # how a series of commits was reworked, like `git range-diff`
diffle --help           # all commands and flags

diffle pr 需要一个 GitHub令牌. 打开来自另一个存储库的PR 在一个临时克隆中。

关闭最后一个diffle选项卡将停止服务器并打印打开的注释。通过 --keep-alive 让它继续运转。

审查

  • j / k:下一行或上一行(10j(往下十行)
  • J / K:下一个或上一个文件
  • ] / [下一个或上一个大块头
  • c:评论
  • C:注释整个文件
  • V:选择一个块
  • R:解决
  • v:已查看标记
  • /:搜索当前文件
  • g/:搜索所有修改的文件
  • gf:过滤文件
  • F:打开完整文件
  • Ctrl+o:回去
  • yy复制所有注释
  • yl:一旦提交被推送,将GitHub永久链接复制到当前行或选择

新闻 ? 查看完整列表。

比较程序在线程之上列出了它的提交。选择一个,或者与 < 和 >,看 独自行动; 所有更改 返回到整个范围。对集中提交的注释 属于那个提交,比如 diffle show.

注释存在于 <git-dir>/diffle/ 永远不要碰你的工作树。他们跟着他们的文本 一旦代码离开diff,它就会改变并过时。

生成的文件开始崩溃,在GitHub上: linguist-generated 在 .gitattributes 标志着 他们, linguist-generated=false 选择一个文件退出。要折叠其他文件,请添加自动查看 Globs在Settings或with中 diffle config.

发送评论到GitHub

拉取请求图标将一个线程或所有打开的线程添加到PR上的未决审查中。 diffle从不提交评论:你自己在GitHub上编辑、删除和提交评论。添加一个 线程再次更新它的注释,而不是复制它。

当比较匹配PR的提交差异时,导出工作,因此未推送的提交和 工作树的变化排除了这种可能性。跳过过时的线程。

Diffle从 GITHUB_TOKEN,然后 GH_TOKEN,然后登录 gh. 没有一个,除了GitHub之外的所有东西都可以工作。 GITHUB_API_URL 点在另一个GitHub API,如动作。

对于GitHub企业服务器,将其主机添加到 githubHosts 在配置文件(diffle config 输出它的路径)。每个条目将远程url中的主机映射到服务web UI的主机 API,相同的,除非远程使用另一个,就像只使用ssh的主机一样:

{
  "githubHosts": {
    "github.work.com": "github.work.com",
    "ssh.work.com": "github.work.com"
  }
}

一次运行与一个GitHub对话:拉请求URL的,否则原点的,否则所有GitHub的 遥控器份额。然后令牌来自 GITHUB_ENTERPRISE_TOKEN, GH_ENTERPRISE_TOKEN,或者 gh auth login --hostname <host>.

跳转到定义

Diffle为diff中的每种语言启动一个语言服务器,如果它找到一个 PATH:

  • gd 或者Ctrl/Cmd+click:定义
  • gy:类型定义
  • gA引用:
  • gs / gS:文件或存储库符号
  • gh: hover,包括JSON、YAML和TOML的模式文档
  • w / b / 0 / $:逐级浏览一条线的符号;光标或指针下的部分被着色 它在文件中出现的任何地方,都是写而不是读

结果在diff之外,如标准库,打开只读。大型存储库可以 花点时间索引。

diffle lsp 显示每种语言获得的服务器以及其余语言需要安装的服务器:

python    pyrefly lsp
rust      not on PATH (tried rust-analyzer)

覆盖服务器或在运行时关闭服务器:

diffle working --lsp python="pyrefly lsp"        # this run only
diffle working --no-lsp                          # none at all

或者在配置文件(diffle config 输出它的路径和内容):

{ "lspCommands": { "rust": "rust-analyzer", "java": "" } }

语言服务器在存储库中运行,可以读取用户可以读取的任何内容。 --no-lsp 没有开始。

以图表的形式查看变化

新闻 M 将diff替换为变化的图形:每个文件一个框,或每个符号 s,在互相使用的地方放一支箭。 d 添加使用更改的未更改代码, T 测试。

The change graph in diffle: files, then symbols, a function's links in the side panel, a peek at the lines behind them, then a pan to two linked symbols

点击一个方框,在侧面面板中列出它的用途和用途; 偷看 的步骤 在不离开图形的情况下,这些链接后面的线。面板中的卡片,或者双击 盒子,把它和它的邻居框起来。 Enter 打开diff中的选择,然后 M 返回到您离开时的图形。

图表需要语言服务器,同样的服务器 跳转到定义 用途。

从懒惰开始

lazygit 自定义命令打开diffle是什么 选中。把它们加到它的 config.yml (lazygit --print-config-dir 打印文件夹):

customCommands:
  - key: '<c-d>'
    context: 'files'
    command: 'diffle working'
    output: terminal
    description: 'Review uncommitted changes in diffle'
  - key: '<c-d>'
    context: 'commits'
    command: 'diffle {{.SelectedCommitRange.From}}^..{{.SelectedCommitRange.To}}'
    output: terminal
    description: 'Review the selected commits in diffle'
  - key: '<c-d>'
    context: 'localBranches'
    command: 'diffle main...{{.SelectedLocalBranch.Name}}'
    output: terminal
    description: 'Review the branch against main in diffle'

Lazygit等你复习;关闭制表符返回制表符,打开的注释打印为 一个提示。附加 | pbcopy (或您的剪贴板工具)到一个命令来复制它们。

壳完成

diffle completion --shell bash > ~/.local/share/bash-completion/completions/diffle
diffle completion --shell zsh > ~/.local/share/zsh/site-functions/_diffle   # on fpath, before compinit
diffle completion --shell fish > ~/.config/fish/completions/diffle.fish

升级后重新运行以获取新命令。修订没有完成。

在反向代理的背后

Diffle在路径前缀下工作,例如 https://proxy.example/diffle/ 没有额外的设置。 代理是否剥离前缀,包括WebSocket升级 /diffle/ws,相信它。 公共来源:

diffle working -H 0.0.0.0 --no-open --allowed-origin https://proxy.example

如果代理将Host和Origin重写为其上游地址,例如Kubernetes服务 名字,信任那个地址。一个被拒绝的请求得到一个403,命名失败的标头。

在远程机器上

在一个只有你可以连接的Unix套接字上提供服务,并通过SSH转发它:

diffle working --socket /home/me/diffle.sock          # on the remote machine
ssh -N -L 4966:/home/me/diffle.sock remote            # here, then open http://localhost:4966

远程计算机上没有打开浏览器。关闭通过套接字连接的最后一个选项卡 在那里切换并打印您打开的评论,就像在您自己的机器上一样。 --socket 需要macOS或 Linux,转发需要OpenSSH 6.7及以上版本。

开发

服务器是Rust (crates/diffle),客户端TypeScript;你需要一个Rust工具链 (rust-toolchain.toml pin)和Node.js。

pixi 安装工具链、git、gh和lefthook from pixi.lock,及其任务 是本地和CI中的入口点。NPM构建和测试客户端;货物构建和测试 服务器,其发布版本嵌入了客户机。

pixi run diffle working                   # build the client, then serve the working tree
pixi run test-node && pixi run test-rust  # the client's and the server's suites
pixi run lefthook-run                     # the pre-commit hook over every file, as CI runs it
pixi run build-release                    # the release binary
pixi run diffle lsp                       # the language servers the environment resolves

环境将真正的语言服务器放在PATH上,所以 pixi run diffle working 和他们一起评论。 pixi run lefthook-install 连接预提交钩子(.lefthook.yml):它格式化和检查分级文件,类型检查,并检查整个树的文件大小和文件夹限制。 pixi run lefthook-run 在每个文件上运行相同的钩子,就像CI一样。 调试构建如下所示 crates/diffle/client 从磁盘:在客户端更改后,运行 npm run build 然后重新加载页面。发布版本(cargo build --release)嵌入客户端。 npm run fixture -- <dir> 构建测试审查的存储库,包括重命名、二进制文件、 CRLF等等。该浏览器套件在Docker容器中驱动剧作家的Linux Chromium (compose.yml(由套件启动和停止),同时运行测试和发布二进制文件 原生的,所以截图匹配CI在每个主机上:

pixi run e2e                              # the browser suite, after the release build
pixi run e2e -g search                    # matching scenarios
pixi run e2e-report                       # open the last report
pixi run e2e --update-snapshots           # accept new screenshots

看到 AGENTS.md 更多信息。

致谢

Diffle的灵感来自 difit. 渲染差异 @pierre /差别.

版本与发布记录

@moritzwilksch/diffle 共发布 30 个版本,首次发布于 2026/09/09;过去 12 个月发布了 30 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.3.6latest2026/11/021 天前
0.3.52026/10/294 天前
0.3.42026/10/259 天前
0.3.32026/10/2410 天前
0.3.22026/10/2311 天前
0.3.12026/10/2212 天前

关于 @moritzwilksch/diffle 的常见问题

@moritzwilksch/diffle 是什么?

浏览器中的本地git diff审阅器,将行注释导出为代理提示

如何安装 @moritzwilksch/diffle?

在项目目录运行 npm install @moritzwilksch/diffle,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 diffle,可以用 npx diffle 直接运行。

@moritzwilksch/diffle 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/moritzwilksch__diffle 是否存在。

@moritzwilksch/diffle 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@moritzwilksch/diffle 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@moritzwilksch/diffle 可以商用吗?

@moritzwilksch/diffle 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@moritzwilksch/diffle 还在维护吗?

最新版本 0.3.6 发布于 2026/11/02(1 天前);至今共发布 30 个版本,其中过去 12 个月发布了 30 个;首次发布于 2026/09/09。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。