# @moritzwilksch/diffle 中文文档

规范地址：https://npmcn.com/package/%40moritzwilksch/diffle/

版本：0\.3\.6
npm 元数据更新时间：2026-11-01T21:50:22.266Z
中文译文更新时间：2026-11-01T22:32:14.360Z
软件包许可：Apache-2\.0

本文由上游 README 机器翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40moritzwilksch/diffle
原文对照：https://npmcn.com/package/%40moritzwilksch/diffle/?lang=original
项目主页：https://diffle.app/
源码仓库：https://github.com/moritzwilksch/diffle

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：452 kB，5 个文件
- 模块格式：ES Module
- TypeScript 类型：未声明
- Node.js 要求：\>=20
- 运行依赖：0 个
- 首次发布：2026-09-08T20:14:10.938Z
- 最新版本发布：2026-11-01T21:50:21.986Z
- 已发布版本数：30（近 12 个月 30 个）

## 中文简介

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

## 安装

```sh
npm install @moritzwilksch/diffle
```

也可以使用：`pnpm add @moritzwilksch/diffle`、`yarn add @moritzwilksch/diffle`、`bun add @moritzwilksch/diffle`

## README

# diffle

[![CI](https://img.shields.io/github/actions/workflow/status/moritzwilksch/diffle/ci.yml?style=flat-square&branch=main)](https://github.com/moritzwilksch/diffle/actions/workflows/ci.yml) [![conda-forge](https://img.shields.io/conda/vn/conda-forge/diffle?logoColor=white&logo=conda-forge&style=flat-square)](https://prefix.dev/channels/conda-forge/packages/diffle) [![conda-forge-platforms](https://img.shields.io/conda/pn/conda-forge/diffle?style=flat-square)](https://prefix.dev/channels/conda-forge/packages/diffle) [![npm](https://img.shields.io/npm/v/%40moritzwilksch%2Fdiffle?logo=npm&logoColor=white&style=flat-square)](https://npmx.dev/package/@moritzwilksch/diffle) [![website](https://img.shields.io/badge/website-diffle.app-0349b4?style=flat-square)](https://diffle.app/)

在浏览器中查看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](https://npmcn.com/package/%40moritzwilksch/diffle/.github/assets/videos/review-light.gif)

## 安装

```bash
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上：

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

它安装为 `~/.local/bin`． 集 `DIFFLE_INSTALL_DIR` 改变它，或者 `DIFFLE_VERSION=v0.4.0` 固定一个释放器。在Windows （x64, arm64）上，从PowerShell：

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

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

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

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

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

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

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

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

## 选择要回顾的内容

```bash
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令牌](https://npmcn.com/package/%40moritzwilksch/diffle/#readme-send-comments-to-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`](https://cli.github.com/)． 没有一个，除了GitHub之外的所有东西都可以工作。 `GITHUB_API_URL` 点在另一个GitHub API，如动作。

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

```json
{
  "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)
```

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

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

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

```json
{ "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](https://npmcn.com/package/%40moritzwilksch/diffle/.github/assets/videos/graph-light.gif)

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

图表需要语言服务器，同样的服务器 [跳转到定义](https://npmcn.com/package/%40moritzwilksch/diffle/#readme-jump-to-definitions) 用途。

## 从懒惰开始

[lazygit](https://github.com/jesseduffield/lazygit) 自定义命令打开diffle是什么 选中。把它们加到它的 `config.yml` （`lazygit --print-config-dir` 打印文件夹)：

```yaml
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` （或您的剪贴板工具）到一个命令来复制它们。

## 壳完成

```bash
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`，相信它。 公共来源:

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

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

## 在远程机器上

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

```bash
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](https://pixi.sh/) 安装工具链、git、gh和lefthook from `pixi.lock`，及其任务 是本地和CI中的入口点。NPM构建和测试客户端；货物构建和测试 服务器，其发布版本嵌入了客户机。

```bash
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在每个主机上：

```bash
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](https://npmcn.com/package/%40moritzwilksch/diffle/AGENTS.md) 更多信息。

## 致谢

Diffle的灵感来自 [difit](https://github.com/yoshiko-pg/difit). 渲染差异 [@pierre /差别](https://github.com/pierrecomputer/pierre).

## 常见问题

### @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 和提交记录判断。

