diffle
在浏览器中查看Git差异,并对行、块或整个文件进行注释。然后把 将评论作为提示发送给代理,或将评论作为待审核内容发送给GitHub。
安装
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 测试。
点击一个方框,在侧面面板中列出它的用途和用途; 偷看 的步骤
在不离开图形的情况下,这些链接后面的线。面板中的卡片,或者双击
盒子,把它和它的邻居框起来。 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 /差别.