暂存单行时出现“致命:XX 行的损坏补丁”

Posted

技术标签:

【中文标题】暂存单行时出现“致命:XX 行的损坏补丁”【英文标题】:"fatal: corrupt patch at line XX" when staging single line 【发布时间】:2012-08-22 07:00:51 【问题描述】:

当我尝试使用 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行!?注意用新行结尾的文件没有解决问题

【问题讨论】:

你能粘贴你想上台的台词吗?具体来说,您是否尝试使用“文件末尾没有换行符”来制作补丁?参考文献this thread 它与特定行无关,但是,有些行之后无法暂存单行,我目前没有这个问题。我会尝试发布,当我再次面对它 【参考方案1】:

显然是 Git GUI requires that files end with a newline when staging individual lines。

我很确定至少在某个时间点,即使文件末尾没有换行符,也可以暂存单个行,但显然这不再可能。我自己也遇到了这个问题,文件末尾的换行符修复了它,删除它们会导致它。

【讨论】:

我不确定,有些行可以暂存,有些行不能暂存(在同一个文件中),我的某些字符可能会导致此问题,但我不知道其中, 添加换行符对我不起作用,但我认为有时会起作用的有趣想法。 刚刚也遇到了这个问题。添加换行符对我也不起作用,但无论如何都有git add -p -- &lt;file&gt; 对于那些评论说这不起作用的人:您将无法使用 git gui 修补此文件直到您将换行符添加到末尾文件,并提交它。使用换行符提交后,您可以再次对其进行修补。 可以确认@DrewNoakes 所说的。这正是它对我的表现。这个帖子是正确答案。供参考:git.661346.n2.nabble.com/…【参考方案2】:

实际上,这经常发生在您编辑“-”行时。当您删除“-”并忘记添加“”(空格)而不是它时

或者,您错误地添加了两个空格并使用“制表符”作为标识

打开你的补丁并检查所有你想保持不变的行都以''开始(一个空格)

我看到有些人使用 --ignore-space-change --ignore-whitespace --whitespace=fix 作为解决方法,但这是另一件你不能混入的东西。

打开你的补丁并检查你想要保持不变的所有行都以''(空格)开头

UPD

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

-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 <--- 

UPD2

所以如果在下一行的补丁中

android:tileMode="repeat"

您的编辑器删除了训练空间。补丁会失败

【讨论】:

【参考方案3】:

当您使用的块太大(即修改了太多连续行)时,Git GUI 无法从索引中添加/删除行。

我的解决方法:如果更改不是“粉墙”(如果块中间有一些未修改的行),请转到编辑 > 选项并减少差异上下文中的行数。如果这不起作用,你就完蛋了;使用其他工具(例如命令行)。

【讨论】:

为我工作。实际上,除了最后一块相当大(我认为大约 50 行)并且还有 Kyle 描述的 no-newline-problem 之外,我实际上能够在任何地方放置台词。通过将上下文的行数设置为 1,我想要暂存的内容被移动到倒数第二个块中,因此我能够暂存它。【参考方案4】:

我在登台时遇到了这个错误。

这里提到的“空白”提醒我,在我的 git diff 选项中,我有一个“-w”,它在比较时会跳过空白。

我删除了那个标志(使用 git-gui 的“选项...”),并且能够在没有错误的情况下上演大块头。然后我将其添加回来(因为我通常不希望在检查已更改的内容时看到空白差异)。

不确定这会对您有所帮助,但尝试并轻松撤消它是无害的。

【讨论】:

【参考方案5】:

受 kyl191 的回答启发,我想出了一个简单的解决方案来解决这个问题:

    在文件末尾添加换行符

    存储所有更改

    git stash
    

    再次在文件末尾添加换行符,这样您的当前文件和隐藏版本中都有换行符

    暂存相应的大块(仅包含您的换行符)

    git stage <your file>
    

    从存储中弹出你的更改

    git stash pop
    

现在您应该能够通过 gui 暂存单行而不会出现此错误。这是有效的,因为在您只暂存包含换行符的部分之后,从 stash 恢复的版本的差异已经看到一个以换行符结尾的文件。

【讨论】:

【参考方案6】:

我遇到了这个问题,因为我试图在我的 emacs 补丁中添加一个换行符,当我保存它时,它会在最后自动删除换行符。

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

【讨论】:

以上是关于暂存单行时出现“致命:XX 行的损坏补丁”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSUserDefaults Swift 2.3 中保存单例对象?

在 rails 中保存单选按钮值

Wine-Staging 4.9 发布,增添一些新补丁

如何向数据库中保存单引号,双引号等字符

EBS并发管理器启动失败,系统暂挂,在重置计数器之前修复管理程序

为啥删除 UITableView 行时会出现错误?