根据官方 git文档:
git apply
--ignore-space-change, --ignore-whitespace
When applying a patch, ignore changes in whitespace in context lines if necessary.
Context lines will preserve their whitespace, and they will not undergo whitespace fixing
regardless of the value of the --whitespace option. New lines will still be fixed, though.
然而,基本测试表明这是一个可恶的谎言。
复现步骤:
- 创建
somefile.txt
并添加以下内容:- 第一行:任意文本
- 第二行:任何非零空格数目的空格
- 第三行:任意文本
git add somefile.txt
cp somefile.txt somefile.orig.txt
- 修改
somefile.txt
:- 第一行:进行任何更改
- 第二行:删除所有空格(现在将是一个空行)
- 第三行:不要更改此行
- 使用git diff创建所谓的“忽略空格”的差异:
git diff -w somefile.txt > somefile.gitdiff
- 请注意,由于
git diff -w
存在明显的错误,因此生成的.gitdiff
将没有 Line 2 上的空格(即更改后的行后面那一行),这会看起来像上下文行。 - 可选地,进行比较:使用GNU diff创建真正忽略空格的差异:
diff -uw somefile.orig.txt somefile.txt > somefile.diff
- 重置
somefile.txt
为其原始版本:git checkout somefile.txt
- 尝试应用我们在步骤5中创建的
gitdiff
补丁:git apply --ignore-whitespace somefile.gitdiff
期望结果:
再次引用git apply
文档的确切话语:
在应用补丁时,如果必要,可以忽略上下文行中的空格更改。
这里我们有一个带有上下文行中空格更改的补丁。因此,期望的是git apply
会按照它所说的实际忽略这个上下文行的空格差异,并成功、干净地应用补丁,没有任何模糊或错误。然而...
实际结果:
应用补丁失败:error: patch failed ... patch does not apply
值得注意的是,使用patch --ignore-whitespace -p1 < somefile.gitdiff
完全正常工作,成功应用补丁,没有任何模糊或错误。
漂亮的表格以帮助说明
diff -w
和 patch --ignore-whitespace
的效果非常好。但是,git
的等效命令效果不佳。
注意: 我已经使用 git v. 2.15.1
和 git v. 2.25.1
进行了测试,并遇到了相同的结果。
问题:
- 我有什么遗漏吗?或者说,2021 年我真的是第一个注意到并且关心这个问题的人吗?
- 是否有任何巧妙/聪明的解决方法?