暂存单行时出现“致命: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 -- <file>
。
对于那些评论说这不起作用的人:您将无法使用 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 中保存单例对象?