2013-01-24 35 views
20

我试过在TextWrangler中编辑一个php文件,将行结束符设置为Unix,NetBeans和vim。当我将diff保存到一个补丁并尝试应用它时,它会给出空白错误。当我输入git diff时,我可以在我的行尾看到^M,但是如果我在vim中手动删除这些文件,它会说我的修补程序文件已损坏,然后该修补程序根本不适用。我的差异包含尾随空白 - 如何摆脱它?

我创建具有以下命令补丁:

git diff > patchname.patch

而且我通过查看一个干净的版本要修补的文件,并键入

git apply patchname.patch

如何应用它我可以创建这个补丁没有空白错误?我之前创建了补丁程序,从未遇到过这个问题。

+0

您可能想要提供有关创建补丁程序的更多详细信息。 – Chronial

+0

我添加了详细信息。不知道这将是多么有用,但它不会受到伤害。 – beth

+0

我面临同样的问题,并做了一些研究。它看起来像git自动添加这些空格到'git diff'和'fit show',所以用这样的代码制作的任何补丁都会有尾随的空格。如果你有本地的linux内核git仓库(linus内核树),你可以运行'git show 402bae597e'。它会在静态DEVICE_ATTR_RO(flags)之前向您显示一个尾随的空白。和上一行中的闭括号,即使它们不在代码中。 – Hamzahfrq

回答

13

你确定那些是很难的错误吗?默认情况下,git会警告空白错误,但仍然会接受它们。如果他们是很难的错误,那么你必须改变一些设置。您可以使用--whitespace=标志至git apply以每个调用为基础进行控制。尝试

git apply --whitespace=warn patchname.patch 

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

控制这个的配置变量是apply.whitespace


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

+1

我明白了。然而,我很困惑这个空白是从哪里来的。我没有问是否应该关心它,我问了如何解决它。 – beth

+0

@beth:你为什么需要修复它? –

+1

空格来自您要应用的修补程序。这意味着它来自你最初采用的差异。 –

7

尝试补丁-p1 < filename.patch

+0

这是做什么用的? .diff文件从哪里来? – beth

+0

它只是一个补丁文件 – flash

+0

我认为你的克拉是向后或缺少某些东西。 – beth

20

GIT中应用--reject --whitespace =固定mychanges.path

+2

用于自动修复空白错误。 --whitespace = fix确保在应用路径之前修复空白错误,--reject确保原子性,因此如果修补程序不适用,则不会修改工作目录文件。来源:https://git-scm.com/docs/git-apply –