问题描述
根据官方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.
然而,一项基本测试表明这不是真的。
复制步骤:
- 使用以下内容创建
somefile.txt
:- 第 1 行:您想要的任何文本
- 第 2 行:任何非零数量的空格
- 第 3 行:您想要的任何文本
git add somefile.txt
cp somefile.txt somefile.orig.txt
- 修改
somefile.txt
:- 第 1 行:进行任何您想要的更改
- 第 2 行:删除所有空格(现在将是空行)
- 第 3 行:请勿更改此行
- 使用 git diff 创建所谓的“忽略空白”差异:
git diff -w somefile.txt > somefile.gitdiff
- 使用 GNU diff 创建真正忽略空格的差异:
diff -uw somefile.orig.txt somefile.txt > somefile.diff
- 比较
somefile.gitdiff
与somefile.diff
。您应该看到diff
和git diff
都产生了一个旨在修改第 1 行的差异(到目前为止,一切都很好)。然而...
预期结果:
两个差异应该相同(除了文件名)。 第 2 行应显示为仅上下文行,其空白保持不变,与原始行保持不变。
实际结果:
GNU diff
生成的 diff 是完美的;然而,git diff -w
生成的差异有一个严重的缺陷:第 2 行中的空格仍然被删除。
第 2 行确实显示为上下文行,而不是要更改的行;然而,因为它与原始的不同而没有被指定,它 1) 是一个实际上没有被忽略的空白更改(与 git diff -w
在罐头上所说的相反),并且更糟糕的是,2)它根本不是一个正确/正确的差异,因为它没有完全/完全匹配它生成的原始文件(因此不能依赖它,这对于诸如 diff 之类的核心工具来说是件大事).
这个问题由于 git apply --ignore-whitespace
中的 an additional bug 也没有做它应该做的事情而变得更加复杂(因此尝试应用给定的有缺陷的补丁将会失败),因为见下表:
一张漂亮的表格,希望能让这个更清楚
diff -w
和 patch --ignore-whitespace
完美运行。 git
的等价物并非如此。
注意:我已经使用 git v. 2.15.1
和 git v. 2.25.1
问题:
鉴于 git
是一个非常受欢迎的工具,已经存在了十多年,我感到非常惊讶/怀疑 1) 它可能仍然没有一个而是两个相当显眼的错误一个相当基本的层面,以及 2) 经过这么长时间,我可能是唯一/第一个注意到/报告这一点的人。
由于以上几点,我想我会先询问 SO 社区:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)