当暂存单行时出现“fatal: corrupt patch at line XX”错误

42

当我尝试使用git gui(右键单击->将行暂存到提交中)暂存单行或多行时,出现以下错误。这不是我第一次遇到这个问题,我发现其他人也面临同样的问题。然而,我找不到解决方法。

是否有人遇到过这个问题?是否有什么方法可以解决(暂存整个文件并不是一个真正的解决办法)

更新: 这里有一个文件,在我尝试暂存已删除的行时会给我以下错误。

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/texture"
    android:tileMode="repeat"
-   android:dither="true"
    >
</bitmap>
\ No newline at end of file

这是错误信息:

fatal: corrupt patch at line 14

奇怪的是下面这个代码看起来不到14行!? 注意用一个新行结束文件并不能解决问题


你能把你正在尝试暂存的行粘贴一下吗?具体来说,你是在尝试使用“文件末尾没有换行符”的补丁进行暂存吗?参见此线程 - Christopher
这与特定的行无关,但是在某些行之后,单独的一行无法被暂存,我目前没有遇到这个问题。如果再次遇到,我会尝试发布一些内容。 - Kirill Kulakov
6个回答

46

3
我也曾遇到过这个问题。添加换行符对我也没有用,但无论如何都可以使用git add -p -- <file>命令。 - musiKk
在我的情况下修复了它(只需将电子邮件中的补丁复制到文件中,但末尾没有换行符。添加它修复了它(使用git命令行))。 - P.R.
5
对于那些评论说这个方法行不通的人:在你给文件末尾添加换行符并提交后,才能使用“git gui”来打补丁。一旦带有换行符的文件被提交后,就可以再次打补丁了。 - Drew Noakes
3
可以确认@DrewNoakes所说的。这也完全是我的情况。这篇帖子是正确的答案。参考链接:http://git.661346.n2.nabble.com/BUG-git-apply-sometimes-says-quot-corrupt-patch-quot-when-adding-single-lines-td5434443.html - Nils_M
对于临时解决方案(直到您想提交带有换行符的块的部分),Zonko的答案可能会有所帮助。 - Sumyrda - remember Monica
显示剩余5条评论

16

实际上,当你编辑'-'行时,这种情况经常发生。
当你删除'-'并忘记添加' '(空格)时

或者,不小心添加了两个空格,并且使用'tabs'作为缩进

打开您的补丁程序并检查所有要保留不变的行是否以' '(一个空格)开头

我注意到有些人使用--ignore-space-change --ignore-whitespace --whitespace=fix作为解决方法,但这是另一件事情,你不应该混在一起使用。

打开您的补丁程序并检查所有要保留不变的行是否以' '(空格)开头

更新

您的编辑器也可能有选项:"删除行末空格"。因此,当您在编辑器中保存补丁时:

-Line with space at end <--- NOTICE: Here one space at the end
+Line with no space at end<--- Here no space

你的编辑器删除了结尾空格,并做出了以下修改:

-Line with space at end<--- Here no space. Patch will FAIL!!!
+Line with no space at end<--- Here no space also

这个补丁会失败,因为原始文件没有这一行:

-Line with space at end<---

它具有:

-Line with space at end <--- 

更新2

因此,如果在您的补丁中,在下一行中:

android:tileMode="repeat"

您的编辑器移除了末尾空格。补丁将失败。


2

当你处理的块太大(即修改了太多连续的行)时,Git GUI无法将行添加/删除到索引中。

我的解决方法:如果更改不是“一堵粉色的墙”(如果在块的中间有一些未修改的行),则转到编辑>选项并减少差异上下文中的行数。如果这样仍然无效,则需要使用其他工具(例如命令行)。


对我来说起作用了。实际上,我能够在除了最后一块之外的任何地方进行分段(我想有大约50行),并且还存在Kyle所描述的无换行符问题。通过将上下文行数设置为1,我想要分段的内容被移动到倒数第二个块中,因此我能够将其分段。 - Sumyrda - remember Monica

1
我在分阶段 hunks 时遇到了这个错误。
这里提到的“空格”让我想起了在我的 git diff 选项中,有一个“-w”,它在 diff 时跳过空格。
我去掉了这个标志(使用 git-gui 的“选项...”),就能够在没有错误的情况下进行分阶段 hunks。然后我又加回来了它(因为我通常不想在检查更改时看到空格差异)。
不确定这是否会对您有所帮助,但尝试一下是相当无害且易于撤消的。

0
受kyl191答案的启发,我想出了一个简单的解决方案:
  1. 在文件末尾添加换行符

  2. 将所有更改存储

    git stash
    
  3. 再次在文件末尾添加换行符,这样你的当前文件和存储版本都有换行符

  4. 暂存相应的块(仅包含你的换行符)

    git stage <your file>
    
  5. 从存储中弹出你的更改

    git stash pop
    
现在您应该能够通过GUI分阶段单独处理每行代码而无需出现此错误。这是因为在您只对包含换行符的部分进行分阶段之后,与从stash恢复的版本的差异已经看到了以换行符字符结尾的文件。

0

我遇到了这个问题,因为我在Emacs中尝试添加一个换行符,但当我保存它时,Emacs自动删除了末尾的换行符。

如果您使用Emacs在补丁末尾添加换行符,它也可能会再次删除它。我打开另一个文本编辑器来添加我的换行符,它起作用了。


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