我有一个Java文件,它的结尾是这样的:
}
}
前段时间我错误地删除了末尾的换行符,但直到今天我在提交时从Git-GUI得到一条错误消息,一切都很好
fatal: corrupt patch at line 36
我尝试添加缺少的换行符,但Git似乎无法正确处理它:
添加换行符之前:
}
}
\ No newline at end of file
添加换行符后:
}
-}
\ No newline at end of file
+}
它仍然给我这个错误。
我尝试恢复更改,只添加新行,而不对文件进行其他更改,但也无济于事。
- 编辑:**添加两个甚至三个换行符也没有帮助。
- EDIT2:**仅当提交最后一个区块内的行时才会出现此错误。
8条答案
按热度按时间ykejflvf1#
这是在编辑'-'行时发生的。
当您删除'-'并忘记添加' '(空格)而不是它
打开你的补丁,检查所有你想保持不变的行都是以' '(空格)开头的
更新
您的编辑器也可能具有以下选项:“删除行尾的空格”。因此,当您在编辑器中保存补丁时:
你的编辑器将删除尾随空格和补丁变成这样:
此修补程序将失败,因为原始文件没有行:
相反,它有:
UPD
有时你想删除
-
行。你可以通过修改空格来改变它。所以这不起作用(这里只是将空格作为第一个字符):要解决这个问题,只需在它后面添加
+
行:此补丁将删除空行并重新添加
zd287kbt2#
另一个潜在的问题,尤其是在使用常规文本编辑器进行编辑时,无法处理块开头的数字,这些数字表示旧代码中有多少行,新代码中有多少行,以及每个代码中的起始位置。如果数字不匹配,则会出现
fatal: corrupt patch at line x
错误。例如,
@@ -32,9 +54,15 @@
告诉它查找原始文件中第32行和接下来9行要替换的代码,但在编辑后的文件中,从第54行开始有15行。如果您添加或删除任何行,您还必须编辑这些数字。虽然我没有做过任何真实的的研究,也没有使用过git gui,但可以想象,因为根据某些标准,不以换行符结束的行在技术上不是行,所以你需要将其中一个或两个数字都更改一个,以使其正确应用。
ljo96ir53#
commit
不对补丁执行任何操作。它甚至没有对内容做任何事情。提交只格式化树和提交对象,并调整HEAD和它所指向的ref。所以不是提交本身导致了这个错误。它也不是
add
,因为当它对新文件内容进行散列时,它对新内容进行操作,并且根本不关心差异。唯一关心差异的是默认的预提交钩子,它检查您没有添加尾随空格和一些类似的问题。您可以通过调用
git commit --no-verify
跳过该检查。但你必须首先启用它,你可能会知道它。0ve6wy6x4#
我刚刚遇到了一个类似的问题(可能是由于git gui的工作原理),这可能对任何拥有它的人都很有用。
当通过
git add -e pom.xml
修补我的pom.xml时,修补程序如下所示。我想删除最后一个Mockito依赖块。如果我只是删除行本身,它总是给我一个错误报告到第64行:
第64行是补丁文件中的最后一行,所以 after
<project>
这一行。解决方案是简单地删除整个 Backbone.js ,所以从@@-行向下的所有内容,它立即工作。
希望这能帮上忙。
vaj7vani5#
我也遇到了同样的问题,最后我明白了这是什么。我的一些行用制表符而不是空格缩进。在将所有缩进更改为空格后,它工作了。
biswetbf6#
我想删除最后一个Mockito依赖块。
如果我只是删除行本身,它总是给我一个错误报告到第64行:
现在(2019年第一季度),你应该不会在Git 2.21+中看到这种错误,因为在2.21之前,当“
git add -e
”想要让用户编辑的更改小于临时文件中遗留的先前更改时,它会感到困惑。add --edit
:截断修补程序文件如果已经有一个
.git/ADD_EDIT.patch
文件,我们不能正确地截断它,这可能会导致非常有趣的错误。当然,这个文件不应该被到处乱放。
但至少在一种情况下,有一个陈旧的副本,大于当前的差异。所以结果是一个损坏的差异。
让我们在写文件的时候截断它,不要太担心它。
zlhcx6iw7#
不是直接回答你的问题,但我只是在运行
git apply something.diff
时遇到了这个错误,解决方案与你的描述非常相似,我认为应该在这里发布给未来的旅行者:something.diff
的结尾没有空行。显然最后一行对git来说很重要,我一添加它它就工作了。au9on6nz8#
好的,抱歉没有仔细检查。
我试着像往常一样添加和提交,但没有Git-GUI,使用命令行,它工作了。
因此,我建议每个人都有问题的Git-GUI不要像我这样做,并检查它通过命令行之前发布。