原始配置
修改后配置

Config Diff:在线对比 INI、TOML、.env 文件

将两个配置文件并排粘贴,立刻看清哪些键、值和注释发生了变化。支持 .env、TOML、INI、.properties 和 .conf。

配置 diff 工具是什么?

一款免费的浏览器端配置文件对比工具。把 staging 的 .env 粘贴到左侧,生产环境的粘贴到右侧,缺失的键、变更的值和过时的注释会立即高亮显示。同样的流程适用于 Poetry 更新前后的 pyproject.toml、即将重载的 nginx.conf,或在不同环境间迁移的 Java application.properties

对比精确到字符级别,没有解析器、没有 schema、也不预设你粘贴的是哪种方言。这是故意的。配置文件没有统一的语法。INI 没有正式规范,各解析器对引号和转义的处理各不相同。TOML 1.0 有严格的语法但引入了类型值。.env 文件完全没有规范,一切都取决于 dotenv 或你的 shell 的行为。

如果你想对比普通文本,文本 diff 工具更合适。对于 YAML 配置(Kubernetes 清单、Helm values、Ansible playbook),请使用 YAML diff。对于以 JSON 传递的配置(VS Code 设置、npm package.json、Terraform tfstate),JSON diff 处理对象重排序比纯文本 diff 更清晰。

diff 的实际工作原理

对比在字符级别运行,然后经过语义后处理将高亮区域调整到完整的键、完整的值和完整的注释行上,避免出现词中噪音。右侧面板用绿色显示插入,左侧用红色显示删除。每个面板标题中的变更计数器会告诉你算法找到了多少处独立编辑。

配置格式差异较大,单一解析器无法覆盖所有格式,因此本工具刻意保持格式无关。.env 是最宽松的:大多数加载器将等号右侧整体视为字符串,但有些会展开 $VAR,有些不会;有些支持 export;带空格的值的引号规则也因解析器而异。.properties 文件(Java 标准,见 java.util.Properties API)接受 =: 作为分隔符,非 ASCII 字符需要 \u00e9 这样的 Unicode 转义。实际中的 INI 文件从 Windows 惯例(方括号节、分号注释)到 Python configparser 模块接受的略有不同的方言,差异较大。

信任干净的 diff 之前,有三个实际陷阱值得注意。第一,行尾空格。像 API_KEY=abc 后面跟着一个多余空格,对大多数加载器来说是不同的字符串,diff 会标记出来,但人眼很难看到那个多余空格。第二,行尾格式。Windows 下用 CRLF 提交的文件和 Linux 下用 LF 写入的文件内容相同,但 diff 会显示每一行都有变化;对比前先格式化双侧或统一行尾。第三,UTF-8 字节顺序标记(BOM)。Windows 上的 Notepad 保存 .env 时仍会写入 BOM,大多数加载器会被它绊倒,表现为第 1 行出现幻影般的单字符 diff。

三步对比配置文件

两个文本面板,一个 diff。不上传任何内容,不记录任何日志。

  1. 1

    粘贴或上传配置

    将旧配置粘贴到左侧,新配置粘贴到右侧。或点击任意一侧的 上传 按钮,直接加载 .env.toml.ini.properties.conf 文件。点击 Sample 按钮可用一个小型 .env 示例填充两侧面板,方便你在粘贴自己的文件之前先看清值变更、新键和删除条目的显示效果。

  2. 2

    格式化并规范化

    在每个面板点击 Format,去除行尾空格并统一行尾格式。这能消除最常见的假阳性:两个看起来一模一样的文件,因为一个用 CRLF 保存、另一个用 LF 保存,diff 却显示完全不同。双侧行尾一致后,diff 就能聚焦于真正的键值变更。

  3. 3

    阅读 diff 结果

    左侧红色高亮为删除,右侧绿色高亮为插入。滚动任意一侧,另一侧会同步跟随。注释和被注释掉的键与普通文本一样参与对比,因此用 # 前缀注释掉的键会显示为注释行被添加,而不是键被删除。

配置 diff 适用的场景

对比本地与 staging 的 .env 文件

你在本地启动功能分支,运行正常,却在 staging 崩溃,原因是 staging 的 .env 里缺少 STRIPE_WEBHOOK_SECRET。把本地可用的文件与 staging 的并排对比,缺失的键、变更的 DATABASE_URL 主机和过时的 LOG_LEVEL=debug 一次全部显现。比逐行翻看两个文件快得多,也比运行一个把所有变量打印到终端的脚本安全得多。

依赖升级后对比 pyproject.toml

Poetry 或 uv 在 poetry update 之后重写了你的 pyproject.toml。对比之前提交的版本与工作区文件,确认实际的升级内容:fastapi0.110.0 升到了 0.115.4,新增了 [tool.ruff.lint] 表,build-system.requires 的版本锁定也发生了变化。TOML 1.0 规范足够严格,diff 结果通常干净易读。

重载前审查 nginx.conf 变更

用错误配置重载 nginx,能比服务器上几乎任何其他操作都更快地把生产站点打挂。执行 nginx -s reload 之前,把正在运行的 nginx.conf 与拟议的新版并排,确认改动确实是你想要的:新增 upstream 块、更新 proxy_pass 目标、TLS 加密套件调整。diff 每次都能抓到那个不小心漏掉的分号。

审计 systemd unit 或 supervisord 配置

部署后某个服务反复重启。把可用的 foo.service 与新版对比,通常三十秒内就能找到原因:ExecStart 被修改、Environment= 行被删除、NoNewPrivileges 被收紧。同样的流程适用于 supervisord 的 .conf 块、runit 运行脚本,以及老旧机器上仍能见到的各种 .ini 风格初始化配置。

对比基础设施即代码的配置文件

terraform.tfvars 中的 Terraform 变量、Pulumi stack 配置、Ansible group_vars、Kubernetes ConfigMap 的 Helm values,每个环境都有自己的副本,安全合并的唯一方式就是做 diff。把生产与 staging 并排,配置漂移立刻暴露:一个 region 固定为 us-east-1,另一个是 us-west-2;有人在某次故障处理中临时调大了实例规格却忘记回滚;IAM role ARN 指向了错误的账号。

检查 CI 环境文件是否与文档模板一致

新工程师入职,从仓库复制 .env.example,第一个 PR 的构建仍然失败,因为模板已经和 CI 流水线实际期望的配置产生了偏差。把提交的 .env.example 与某位构建稳定通过的同事的 .env 对比,缺失的键会以左侧红色或右侧绿色显示。同样的技巧适用于 Taskfile env 块、GitHub Actions 的 env: 节,以及 direnv.envrc 文件。

配置格式快速参考

本工具最常处理的几种格式的简明速查表。配置文件比其声誉所暗示的更混乱,以下差异正是大多数 diff 出问题的地方。

TopicWhat this tool does
格式方言INI(无正式规范,方言因解析器而异)、TOML 1.0(严格、类型化)、.env(无规范,由解析器定义)、.properties(Java,见 java.util.Properties)、.conf(按应用而定:nginx、Apache、sshd_config 各不相同)。
注释字符INI:;#。TOML:仅 #.env:仅 #,且大多数加载器要求位于行首。.properties#!。nginx .conf:仅 #
节标题INI 和 TOML 使用 [section]。TOML 通过 [a.b.c] 支持嵌套表,通过 [[a]] 支持表数组。.env.properties 是扁平结构,没有节。nginx 使用 { ... } 块而非标题。
值类型TOML 支持类型值:字符串、整数、浮点数、布尔值、日期、数组、表。INI、.env.properties 均为纯字符串,true42 如何解析由应用程序决定。
插值与展开大多数 dotenv 加载器默认不展开 $VAR。部分会展开(dotenv-expand、direnv、通过 source .env shell sourcing)。TOML 从不展开。INI 很少展开;Python configparser 在 opt-in 时支持 ${section:key}
行尾空格真实的 bug 来源。FOO=bar 后面跟一个空格,在大多数加载器中会将 FOO 设置为 "bar ",导致下游字符串相等检查失败。始终去除行尾空格或为值加引号。
行尾格式CRLF(Windows)与 LF(Unix)。两个内容相同的文件分别在不同操作系统上保存,diff 会显示每一行都有变化。使用 Format 按钮或在对比前统一行尾(dos2unixgit config core.autocrlf)。
编码与 BOMTOML 强制使用 UTF-8。.properties 历史上要求 ISO-8859-1 配合 \uXXXX 转义,但现代 Java 通过 Properties.load(Reader) 接受 UTF-8。.env 文件开头的 UTF-8 BOM 是经典幻影 diff 的成因;Windows 上的 Notepad 默认仍会写入 BOM。

Config diff 常见问题

工具能识别值的类型吗?

不能。这是纯文本 diff。TOML 区分字符串、整数、浮点数、布尔值、日期和数组,但 diff 把每一行都当作纯文本,只告诉你哪些字符发生了变化。通常这已经足够,因为配置变更本质上就是字符变更。如果你确实需要类型化比较,可以用语言内置的解析器(Python 的 tomllib、Rust 的 toml crate、Go 的 pelletier/go-toml)各自解析两个文件,再对比生成的映射。95% 的情况下,文本 diff 就能捕获你需要发现的内容。

如何处理"有差异"但语义等价的注释行?

通常不需要处理,而且应该庆幸工具把它标出来了。从 API_KEY=abc 变成 #API_KEY=abc 在语义上是有意义的:这个键现在被禁用了。diff 高亮了注释前缀的变化,正是配置审查时人工审阅者应该看到的内容。如果你真的想忽略注释噪音,可以在粘贴前格式化双侧,去掉纯注释行,但对安全相关的文件来说,这通常不是正确的做法。

如何检查某侧缺少某个键?

粘贴两个文件,运行 diff,任何一侧有而另一侧没有的键都会显示为整行红色删除或绿色插入。diff 不会对键进行结构对齐,因此一个被移到不同位置的键会既出现一次删除、又出现一次插入。如果需要完全忽略顺序的对比,先按键对两个文件排序(Unix 下 sort .env),再做 diff。格式无关的方式无需解析器就能捕获缺失的键。

粘贴含真实密钥的 .env 文件安全吗?

安全。你的输入永远不会离开浏览器。diff 完全在客户端运行,没有服务器上传,没有针对两侧面板内容的遥测,也没有记录你输入内容的分析。这是有意为之,因为 .env diff 是本站信任度最高的工作流之一。如果你有所顾虑(保持一点顾虑是对的),打开浏览器开发者工具,确认粘贴过程中 Network 面板保持空白。对于需要完全离线工具的团队,将页面离线加载一次,缓存的资源即可在不再需要网络的情况下继续工作。

TOML 和 INI 有什么区别?

INI 是一种惯例,TOML 是一份规范。INI 起源于 Windows,没有正式语法,各解析器对边界情况(引号、转义、列表值、嵌套节)的处理略有不同。TOML 1.0 是严格的版本化规范,被 Cargo、Poetry、Hugo 以及越来越多的 Python 打包工具(通过 pyproject.toml)采用。两者都使用 [section] 标题和 key = value 对,乍看相似,但 TOML 增加了类型值、日期时间字面量和内联表,这些都是经典 INI 文件所没有的。

diff 会规范化键的大小写或空格吗?

不会。API_KEY=abcapi_key=abc 对 diff 来说是不同的行,因为它们是不同的字节。大多数加载器也是大小写敏感的(dotenv、java.util.Properties、configparser 默认如此),这与实际行为一致。= 周围的空格原样保留,这一点很重要,因为部分较严格的解析器(尤其是某些 Bash sourcing 模式)会拒绝 FOO = bar 带空格的写法,只接受 FOO=bar。Format 按钮会去除每行的行尾空格,这是它唯一执行的规范化步骤。

config diff 免费吗?需要注册账号吗?

免费,也不需要注册,没有账号、没有试用计时器、没有键数限制。粘贴、阅读 diff、关闭标签页,整个流程就是这么简单。本工具作为免费实用工具运营,而不是 freemium 漏斗,所以没有隐藏有用功能的"专业版"。Format、上传和 Sample 无需登录即可使用,首次访问和每次访问均如此。

与 DiffChecker 或 VS Code 内置 diff 有什么区别?

两个文件已经在你打开的项目里时,VS Code 的 diff 很难被超越。但当两个配置文件分别在剪贴板而不在磁盘上时,本工具更快:比如一个从 Slack 粘贴的值对上终端里的值。与 DiffChecker 等在线工具相比,真正的区别在于什么都不上传:装满线上密钥的 .env 在你的浏览器里完成 diff,永远不会到达服务器。Format 中的空格和行尾规范化也是专为配置文件调优的,而非通用文本。

可以上传两个文件而不是粘贴吗?

可以。在任意面板点击 上传,选择一个 .env.toml.ini.properties.conf 文件。浏览器通过 File API 在本地读取文件,直接将文本填入编辑器,不会有任何内容离开你的机器。最常见的用法是一侧上传、另一侧粘贴:从磁盘加载已提交的文件,从服务器会话粘贴线上版本。没有格式检查,只要是文本就能加载。

能同时对比两个以上的配置文件吗?

不能在单一视图中实现。本工具围绕两个面板构建,一次只比较两个文件。如果需要三向对比(本地、staging、生产的 .env 协调),运行两次即可:本地对 staging,再 staging 对生产。多点几下鼠标,但依次阅读两个干净的 diff,远好于眯眼盯着三列 KEY=value 行。

离线和手机上能用吗?

都可以。diff 是纯客户端 JavaScript,不需要服务器调用,页面加载完成后断开网络依然可以正常工作,在受限服务器或不稳定 VPN 环境下很有用。手机上两个面板会垂直堆叠,支持双指缩放,不过配置 diff 在笔记本上读起来确实更舒服,两列可以同屏显示。

隐私与工作原理

你的配置文件永远不会离开浏览器。diff、格式化器以及你输入的每一个字节都在本地机器上处理。不分析两侧面板的内容,不记录日志,不上传。这一点比大多数 diff 工具更重要,因为 .env 文件往往包含数据库密码、API 密钥和 OAuth 客户端密钥,把它们粘贴到一个需要与服务器往返的工具里会是真实的安全事故。相关格式的延伸阅读:TOML 1.0INI 文件,以及 Unix 的环境变量概念。对于不应写入文件的密钥,可以参考 sops、HashiCorp Vault 或 AWS Parameter Store。