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

jdu*_*unk 10 git diff git-diff

根据官方git 文档

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.
Run Code Online (Sandbox Code Playgroud)

然而,基本测试表明事实并非如此。

复制步骤:

  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 :diff -uw somefile.orig.txt somefile.txt > somefile.diff
  7. 比较somefile.gitdiffsomefile.diff​ 您应该看到 和diffgit diff生成了一个差异,旨在仅修改第 1 行(到目前为止,一切顺利)。然而...

预期结果:

两个差异应该相同(文件名除外)。第 2 行应显示为仅上下文行,其空格完好无损,与原始行没有任何改变。

实际结果:

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

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

这个问题因一个额外的错误而变得更加复杂,该错误git apply --ignore-whitespace也未能执行其应有的操作(因此尝试应用给定的有缺陷的补丁将会失败),如下表所示:

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

错误与 git-diff-and-apply-not-ignoring-whitespace

diff -w并且patch --ignore-whitespace工作完美。git等价物则不然。

注意:git v. 2.15.1我已经使用和进行了测试并遇到了相同的结果git v. 2.25.1

问题:

鉴于这git是一个已经存在了十多年的成熟且非常受欢迎的工具,我非常惊讶/怀疑:1)它在相当基本的层面上仍然可能存在不是一个而是两个相当明显的错误,2)毕竟,我可能是唯一/第一个注意到/报告这一点的人。

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

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

小智 0

  • 不; 你发现了一个真正的错误。
  • 没有解决办法,除了你自己的:使用 GNU 工具。
  • 是的,您应该将其报告给 git 开发人员。

您的表格可以使用更好的标签。我会推荐diff command在左侧和patch command顶部。