根据官方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
使用以下内容 创建:- 第 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
- 请注意,由于存在明显的错误,生成的第 2 行(更改行之后的行)将
git diff -w
没有空格,该行显示为上下文行。.gitdiff
- 可选地,为了比较:使用 GNU diff创建一个真正忽略空格的差异:
diff -uw somefile.orig.txt somefile.txt > somefile.diff
- 重置
somefile.txt
为原始版本:git checkout somefile.txt
- 尝试应用
gitdiff
我们在第 5 步中创建的补丁: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 年第一个注意到/烦恼提出这个问题的人?
- 有什么聪明/巧妙的解决方法吗?