【问题标题】:How to prevent git from generating false difference for JSON files?如何防止 git 为 JSON 文件生成错误的差异?
【发布时间】:2017-09-12 20:45:10
【问题描述】:

git 认为a .json file 的两个版本不同,但实际上它们的数据不是:

@@ -469,9 +479,9 @@
       "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=",
       "dev": true,
       "requires": {
+        "JSONStream": "1.3.1",
         "combine-source-map": "0.7.2",
         "defined": "1.0.0",
-        "JSONStream": "1.3.1",
         "through2": "2.0.3",
         "umd": "3.0.1"
       }

我们如何告诉 git 忽略 JSON 文件的这种差异?

注意:

以下代码from Tomasz Wegrzanowski's Blog

echo "*.json diff=json" >> .gitattributes
git config diff.json.textconv json_pp

无法正常工作并导致 git diff 挂起

【问题讨论】:

  • 这个.json文件是否以某种方式自动生成并且元素的顺序是基于自动生成的动态的?
  • 没错,就是npm生成的package-lock.json文件。
  • 我认为您需要阅读以下内容:stackoverflow.com/questions/44206782/…,您正试图避免跟踪此文件上的这些更改,但对于所有其他帐户,您应该跟踪它...跨度>
  • 如果您考虑一下,git 旨在跟踪文件的更改(显然),您可以排除您不关心的文件,但 package-lock.json 是您关心的文件。如您所知,NPM 可能会根据依赖关系重新组织所需包的列表(即取决于您的设置和其他包,它可能认为应该首先需要 JSONStream)。你会想要跟踪这个变化。
  • 如果不是Object,而是Array,那将是正确的。 {a: 1, b: 2} 等于 {b: 2, a: 1},其中 [1, 2][2, 1] 不同。这就是为什么这些版本完全相同。

标签: json git diff package-lock.json


【解决方案1】:

我配置的东西挂起,因为 json_pp 不接受文件名作为参数。 这意味着在您的配置中 json_pp 等待标准输入流上的输入,并导致您不提供任何输入流您的 git diff 挂起 在我的 gitconfig 中,我已经像这样实现了 json_pp:

[diff "json"]
         textconv = "cat \"$1\" | json_pp --json_opt=canonical,pretty" 

对我来说这很好用。如果您愿意,您可以更改 --json_opt 值以获得您最喜欢的输出格式。 但是如果键的顺序改变了,这个配置仍然会有所不同。

在 git 版本中测试 2.16.1.windows.1

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多