我的差异包含尾随空格 - 如何摆脱它?

Posted

技术标签:

【中文标题】我的差异包含尾随空格 - 如何摆脱它?【英文标题】:My diff contains trailing whitespace - how to get rid of it? 【发布时间】:2013-01-08 17:12:33 【问题描述】:

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

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

git diff > patchname.patch

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

git apply patchname.patch

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

【问题讨论】:

您可能想提供有关创建补丁程序的更多详细信息。 我添加了详细信息。不确定这会有多大帮助,但不会有伤害。 我也面临同样的问题并进行了一些研究。看起来 git 会自动将这些空格添加到 git difffit show,因此使用此类代码制作的任何补丁都会有尾随空格。如果您在本地有 linux 内核 git 存储库(linus 内核树),则可以运行 git show 402bae597e。它会在静态 DEVICE_ATTR_RO(flags); 之前显示一个尾随空格。和上一行中的右大括号,即使它们不存在于代码中。 @Chronial 可以通过在方法的开头或开头添加一行来重现此问题(您在行的开头写了一些东西,例如打开/关闭大括号或函数原型)。然后运行git diff。您可以在未更改的文件之前看到额外的空格。然后在使用 git format-patch 时将它们引入补丁 【参考方案1】:

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

git apply --whitespace=warn patchname.patch

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

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


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

【讨论】:

我明白这一点。但是,我对这个空白的来源感到困惑。我没有问我是否应该关心它,我问的是如何解决它。 空格来自您尝试应用的补丁。这意味着它来自您最初采用的差异。 我知道。我正在尝试找出如何在不结束空格的情况下创建差异。 @beth:嗯,在创建差异之前删除源代码中的尾随空格?或者你可以直接使用git apply --whitespace=fix patchname.patch,它会为你修复它看到的空白错误。 @beth:你提到试图从差异中删除它。手动编辑差异是一个棘手的过程。但同样,您可以使用git apply --whitespace=fix patchname.patch,git 会为您修复空白。【参考方案2】:

试试patch -p1

【讨论】:

这是做什么的? .diff 文件来自哪里? 它只是一个补丁文件 我觉得你的克拉倒了或者少了点什么。 patch 命令不会告诉 git 文件已被添加或删除。 zednight (git apply --reject --whitespace=fix mychanges.path) 的建议更好,因为它可以正确处理添加和删除的文件。 原来的符号(<正确的,这样目标文件是由补丁文件本身决定的。见man patch: patch [options] [originalfile [patchfile]] 但通常只是 patch -pnum 【参考方案3】:

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

【讨论】:

有助于自动修复空白错误。 --whitespace=fix 确保在应用路径之前修复空白错误,并且 --reject 确保原子性,因此如果不应用补丁,则不会修改工作目录文件。来源:git-scm.com/docs/git-apply【参考方案4】:

单行解决方案是:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

其实我觉得还没有【参考方案6】:

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

我以前总是遵循以下命令。

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

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

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

【讨论】:

如果最后一行只是换行符,这似乎不起作用【参考方案7】:

你可以使用 combineiff 和 patchutils [1] 中的 -w 选项

git diff | combinediff - /dev/null -w &gt; patchname.patch

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

【讨论】:

以上是关于我的差异包含尾随空格 - 如何摆脱它?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查我的表中列的任何值是不是包含 MS ACCESS 2003 中的尾随空格?

使用python如何摆脱从网站上抓取的文本中的尾随空格[重复]

让 Git 在提交前自动删除尾随空格

限制 XSD 中的字符串,使它们没有前导或尾随空格,并且只包含字母数字、连字符和下划线?

从字符串值中删除空格(前导和尾随)

如何删除 MySQL 字段中的前导和尾随空格?