`git diff -w`或 `--ignore-all-space`已损坏

问题描述

根据官方git docs

git diff
    -w,--ignore-all-space
           Ignore whitespace when comparing lines. This ignores differences
           even if one line has whitespace where the other line has none.

然而,一项基本测试表明这不是真的。

复制步骤:

  1. 使用以下内容创建 somefile.txt
    • 第 1 行:您想要的任何文本
    • 第 2 行:任何非零数量的空格
    • 第 3 行:您想要的任何文本
  2. git add somefile.txt
  3. cp somefile.txt somefile.orig.txt
  4. 修改somefile.txt
    • 第 1 行:进行任何您想要的更改
    • 第 2 行:删除所有空格(现在将是空行)
    • 第 3 行:请勿更改此行
  5. 使用 git diff 创建所谓的“忽略空白”差异:git diff -w somefile.txt > somefile.gitdiff
  6. 使用 GNU diff 创建真正忽略空格的差异:diff -uw somefile.orig.txt somefile.txt > somefile.diff
  7. 比较 somefile.gitdiffsomefile.diff。您应该看到 diffgit diff 都产生了一个旨在修改第 1 行的差异(到目前为止,一切都很好)。然而...

预期结果:

两个差异应该相同(除了文件名)。 第 2 行应显示为仅上下文行,其空白保持不变,与原始行保持不变。

实际结果:

GNU diff 生成的 diff 是完美的;然而,git diff -w 生成的差异有一个严重的缺陷:第 2 行中的空格仍然被删除

第 2 行确实显示为上下文行,而不是要更改的行;然而,因为它与原始的不同而没有被指定,它 1) 是一个实际上没有被忽略的空白更改(与 git diff -w 在罐头上所说的相反),并且更糟糕的是,2)它根本不是一个正确/正确的差异,因为它没有完全/完全匹配它生成的原始文件(因此不能依赖它,这对于诸如 diff 之类的核心工具来说是件大事).

这个问题由于 git apply --ignore-whitespace 中的 an additional bug 也没有做它应该做的事情而变得更加复杂(因此尝试应用给定的有缺陷的补丁将会失败),因为见下表:

一张漂亮的表格,希望能让这个更清楚

bugs-with-git-diff-and-apply-not-ignoring-whitespace

diff -wpatch --ignore-whitespace 完美运行。 git 的等价物并非如此。

注意:我已经使用 git v. 2.15.1git v. 2.25.1

进行了测试并遇到了相同的结果

问题:

鉴于 git一个非常受欢迎的工具,已经存在了十多年,我感到非常惊讶/怀疑 1) 它可能仍然没有一个而是两个相当显眼的错误一个相当基本的层面,以及 2) 经过这么长时间,我可能是唯一/第一个注意到/报告这一点的人。

由于以上几点,我想我会先询问 SO 社区:

  • 我错过了什么吗?或者我真的是第一个在 2021 年提出这个问题的人吗?
  • 对此有什么巧妙/巧妙的解决方法吗?
  • 这是我应该向 git 社区报告的合法错误吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)