51

我尝试在 TextWrangler、NetBeans 和 vim 中编辑一个行尾设置为 Unix 的 php 文件。当我将差异保存到补丁然后尝试应用它时,它会给出空白错误。当我键入时,git diff我可以在行尾看到^M,但如果我在 vim 中手动删除这些,它会说我的补丁文件已损坏,然后补丁根本不适用。

我使用以下命令创建补丁:

git diff > patchname.patch

我通过检查要修补的文件的干净版本并键入来应用它

git apply patchname.patch

如何创建没有空格错误的补丁?我以前创建过补丁,从来没有遇到过这个问题。

4

7 回答 7

47

git apply --reject --whitespace=fix mychanges.path

于 2014-12-09T06:48:44.943 回答
42

你确定这些是硬错误吗?默认情况下,git 会警告空格错误,但仍会接受它们。如果它们是硬错误,那么您必须更改了一些设置。您可以使用该--whitespace=标志来git apply在每次调用的基础上控制它。尝试

git apply --whitespace=warn patchname.patch

这将强制执行默认行为,即警告但接受。您还可以使用--whitespace=nowarn完全删除警告。

控制它的配置变量是apply.whitespace.


作为参考,这里的空白错误不是您的补丁错误。默认情况下,git 在应用补丁时会抱怨这是一种代码风格的东西。值得注意的是,它不喜欢尾随空格。同样git diff会突出显示空白错误(如果您要输出到终端并且颜色已打开)。默认行为是警告,但无论如何都要接受补丁,因为不是每个项目都对空白很感兴趣。

于 2013-01-25T01:00:43.813 回答
8

尝试补丁 -p1 < 文件名.patch

于 2014-03-21T08:38:52.873 回答
3

当我的队友在 Linux/Windows 上工作或使用 git send-email 时,我多次遇到此类问题。

我一直习惯于遵循以下命令。

git apply -3 --whitespace=fix yourpatch.patch

或者

git am -s -3 --whitespace=fix yourpatch.patch

-3 选项将尝试三向合并,它也将有助于解决其他问题。

于 2020-12-10T09:18:19.107 回答
2

单线解决方案是:

emacs <filename> -f delete-trailing-whitespace -f save-buffer -f kill-emacs

来源: https ://wiki.gnome.org/Projects/GnomeShell/Development/WorkingWithPatches

于 2015-01-19T00:20:55.963 回答
1

我认为如何处理空白的问题已经得到了充分的回答,但你问它来自哪里。您在行尾提到^M:这就是 Git 显示 Windows 行尾的方式。也许在创建补丁之前尝试dos2unix在源文件上运行,或者使用维护原始行结尾的编辑器。

于 2018-06-20T14:01:58.327 回答
0

您可以将 combineiff 与 patchutils [1] 中的 -w 选项一起使用

git diff | combinediff - /dev/null -w > patchname.patch

[1]
https://github.com/twaugh/patchutils
https://repology.org/project/patchutils/versions

于 2021-10-25T11:02:15.400 回答