`git apply --ignore-whitespace` 是有问题的。

7
根据官方 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.

然而,基本测试表明这是一个可恶的谎言。

复现步骤:

  1. 创建somefile.txt并添加以下内容:
    • 第一行:任意文本
    • 第二行:任何非零空格数目的空格
    • 第三行:任意文本
  2. git add somefile.txt
  3. cp somefile.txt somefile.orig.txt
  4. 修改somefile.txt:
    • 第一行:进行任何更改
    • 第二行:删除所有空格(现在将是一个空行)
    • 第三行:不要更改此行
  5. 使用git diff创建所谓的“忽略空格”的差异:git diff -w somefile.txt > somefile.gitdiff
  6. 请注意,由于git diff -w存在明显的错误,因此生成的.gitdiff将没有 Line 2 上的空格(即更改后的行后面那一行),这会看起来像上下文行
  7. 可选地,进行比较:使用GNU diff创建真正忽略空格的差异:diff -uw somefile.orig.txt somefile.txt > somefile.diff
  8. 重置somefile.txt为其原始版本:git checkout somefile.txt
  9. 尝试应用我们在步骤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完全正常工作,成功应用补丁,没有任何模糊或错误。

漂亮的表格以帮助说明

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

diff -wpatch --ignore-whitespace 的效果非常好。但是,git 的等效命令效果不佳。

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

问题:

  • 我有什么遗漏吗?或者说,2021 年我真的是第一个注意到并且关心这个问题的人吗?
  • 是否有任何巧妙/聪明的解决方法?

你有向Git邮件列表报告这个问题吗?https://lore.kernel.org/git/ - undefined
1个回答

0
如您在引用的文档中所见,选项--ignore-whitespace--ignore-space-change是别名。该选项的行为是忽略空白字符的变化,而不是忽略所有空白字符。
空白字符的变化包括添加、在空格和制表符之间进行更改,或者删除。但是,删除所有空白字符不仅仅是空白字符的变化,而是一种实质性的变化。
在提供的示例中,如果从一行中删除了所有空白字符,那就相当于在两个单词之间删除了所有空白字符。这样的变化不仅仅是"空白字符的变化",而是文本的实质性变化。因此,它是不会被忽略的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接