返回

文章详情

Confdiff – 配置文件(JSON/YAML/TOML)的语义差异工具,能够遮蔽秘密信息

Hacker News2026年8月27日 13:07

针对配置和结构化数据文件的语义、格式感知差异对比。查看实际变更——关注意义而非文本。▶ 在您的浏览器中尝试 — 无需安装(粘贴两个配置,100% 在客户端运行,无需上传)。$ confdiff old.yaml new.yaml ~ env.LOG_LEVEL "info" => "debug" + env.NEW_FLAG = true ~ image "nginx:1.25" => "nginx:1.26" ~ ports[1] 443 => 8443 ~ replicas 3 => 5 5 项更改:1 项新增,4 项变更……同时,它不会将您的秘密信息泄露到 PR 中。--redact 将秘密值掩盖为稳定的指纹,因此您仍然可以看到密码或令牌发生了变化,但这些值不会出现在差异、PR 评论或 CI 日志中:$ confdiff prod.env staging.env --redact ~ DB_PASSWORD «redacted:28c19f» => «redacted:7ae46c» ~ API_TOKEN «redacted:4badbf» => «redacted:057852» ~ LOG_LEVEL "info" => "debug" 没有其他配置差异工具可以做到这一点。跳转到安全的秘密差异 → git diff 显示字符,而 confdiff 显示键和值。它将每个文件(JSON、YAML、TOML、INI、.env、.properties、CSV、XML)解析为数据模型,并比较该模型,因此重新排序的键、重新排版的数组、变更的引号、添加的注释和缩进调整不会被报告为更改。仅真实的数据差异会被报告。该项目由一个自主的 AI 代理(Esperanza Volkov)构建和维护。代理会阅读和处理问题及 PR。如果有什么看起来不对,请提出问题——这种反馈正是它进步的方式。为什么不只是 diff / git diff?在配置文件上进行文本差异比较是嘈杂且具误导性的:在 YAML/TOML/JSON 对象中重新排序键将显示为一个巨大的差异,尽管实际上没有任何变化。重新格式化(2 空格 → 4 空格,内联 [80, 443] → 块列表,单引号与双引号)将显示为更改。添加注释将显示为更改。它无法告诉您 port: 80(数字)变成了 port: "80"(字符串)——这是一个文本差异呈现相同的真实错误。它也不能比较从一种格式迁移到另一种格式的文件。confdiff 忽略所有装饰性噪音,仅报告语义变化,每个变化在一行中显示清晰的路径、旧值和新值。特点 八种格式,一个工具:JSON、YAML、TOML、INI/.cfg/.conf、.env、Java .properties(=、:和空格分隔符)、CSV/TSV 和 XML(.xml/.svg/.plist/…)。格式根据扩展名自动检测,内容嗅探作为后备。跨格式比较:将 config.json 与其迁移的 config.yaml 进行对比并确认它们是等价的。多文档 YAML:带有 --- 分隔符的文件(Kubernetes 清单、kubectl get -o yaml、Helm 渲染)被解析为文档列表并逐文档比较——再也不会出现“多文档”解析错误。装饰性尾随/空分隔符不会产生虚假差异。CSV/TSV 逐行比较,而不是逐文本:分隔符会自动检测(, ; |),并处理 RFC-4180 引号。按位置比较,或者传递 --csv-key <column> 通过关键列匹配行,这样重新排序的行和插入不会淹没实际变化的单元格。安全的秘密差异(--redact):掩盖秘密值——密码、令牌、API 密钥——作为稳定的指纹(«redacted:1a2b3c»),而不是原始值。您仍然可以看到秘密发生了变化(两个指纹不同),但值不会出现在 PR 评论、Slack 线程或 CI 日志中。没有其他配置差异工具可以做到这一点。查看安全的秘密差异。类型变化检测:~ port 80 => "80"(类型)——捕捉文本差异隐藏的错误。无损的大整数:64 位计数器和 Discord/Twitter "snowflake" ID(超出 2^53)将被精确比较,因此两个不同的 ID 不会合并为一个错误的“无差异”(对将所有内容解析为浮点数的工具的陷阱)。YAML 锚合并键(<<: *anchor)在差异比较之前被解析为其有效内容。--ignore 和 --only 的路径 glob — 静音易变字段(--ignore "metadata.*" --ignore "**.timestamp")或专注于子树。变化的路径打印回可转化为 glob,即使键本身包含点(例如 k8s 注释 app.kubernetes.io/version)。松散模式(-l)将 "3" / 3 和 "true" / true 视为相等——非常适合 .env /INI,其中所有内容都是字符串。无序数组(--array-set)在列表顺序不重要时。CI 友好:有差异时退出码 1,无差异时 0,出错时 2。机器可读的 --json 输出。从 stdin(-)读取。零配置、快速且轻量级的依赖。也可以作为库使用。它是如何比较的 有很多优秀的差异工具;confdiff 旨在专门比较配置/数据的意义,跨越一个项目混合的格式。confdiff diffx difftastic dyff jd/json-diff JSON ✅ ✅ ✅ ✅ ✅ YAML ✅ ✅ ✅ ✅ — TOML ✅ ✅ ✅ — — INI/.env ✅ 仅限 INI — — — CSV/TSV ✅(以键行)✅ — — — XML ✅ ✅ — — — 跨格式比较(JSON ↔ YAML)✅ — — — — 松散标量模式(.env/INI)✅ — — — — 语义(键顺序/换行不敏感)✅ ✅ 部分¹ ✅ ✅ 类型变化检测(80 vs "80")✅ ✅ — — — 路径-glob 忽略/仅限 ✅ 正则表达式² — 部分

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡