32

我有一个这样结束的Java文件:

    }
}

而且我前段时间错误地删除了最后的换行符,但是直到今天我在提交时收到来自 Git-GUI 的错误消息时还好

fatal: corrupt patch at line 36

我尝试添加缺少的换行符,但 Git 似乎无法正确处理它:

在添加换行符之前:

     }
 }
\ No newline at end of file

添加换行符后:

     }
-}
\ No newline at end of file
+}

它仍然给我这个错误。

我尝试还原更改并仅添加换行符而不对文件进行其他更改,但这也无济于事。

编辑:添加两个甚至三个换行符也无济于事。

EDIT2:仅在最后一个大块内提交行时才会发生此错误。

4

7 回答 7

31

当您编辑“-”行时会发生这种情况。
当您删除“-”并忘记添加“”(空格)而不是它时

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

更新

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

-Line with space at end <--- NOTICE: Here there is one space at the end
+Line with no space at end<--- Here there's 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 <--- 

UPD
有时您想删除-行。您可以通过修剪的空格来更改它。所以这不起作用(这里只是 wihitespace 作为第一个字符):

 

要解决此问题,只需在+其后添加一行:

-
+

此补丁将删除空行并再次添加

于 2015-08-01T11:52:55.750 回答
9

另一个潜在问题,尤其是在使用常规文本编辑器进行编辑时,无法处理大块开头的数字,这些数字表示旧代码中有多少行,新代码中有多少行,以及在哪里它从每个开始。如果数字不匹配,则会fatal: corrupt patch at line x出现错误。

例如,@@ -32,9 +54,15 @@告诉它在原始文件的第 32 行和接下来的 9 行中查找要替换的代码,但在编辑后的文件中从第 54 行开始有 15 行。如果添加或删除任何行,则还必须编辑这些数字。

虽然我没有对它进行任何真正的研究或曾经使用过 git gui,但可以想象,由于根据某些标准,不以换行符结尾的行在技术上不是行,你需要更改其中一个或两个这些数字加一以使其正确应用。

于 2019-03-05T20:04:10.903 回答
2

commit不会对补丁做任何事情。它甚至对他们的内容没有任何作用。提交仅格式化树和提交对象并调整 HEAD 和它指向的 ref。因此,给出此错误的不是 commit 本身。

也不add是,因为虽然它对新文件内容进行哈希处理,但它对新内容进行操作并且根本不关心差异。

唯一关心差异的是默认的预提交钩子,它检查你没有添加尾随空格和一些类似的问题。您可以通过调用跳过该检查git commit --no-verify。但是您必须首先启用它,并且您可能知道它。

于 2013-08-09T09:53:36.857 回答
1

我刚刚遇到了一个类似的问题(可能由于 git gui 的工作原理相同),这对任何拥有它的人都可能有用。

通过 修补我的 pom.xml 时git add -e pom.xml,补丁如下。

diff --git a/pom.xml b/pom.xml
index 3dba69a..a9c8ebb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,26 +1,48 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>adowrath</groupId>
     <artifactId>project-name</artifactId>
     <version>0.0.1</version>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
     <build>
         <sourceDirectory>src/main/java</sourceDirectory>
         <testSourceDirectory>src/test/java</testSourceDirectory>
         <plugins>
             <plugin>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>3.6.1</version>
                 <configuration>
                     <source>1.8</source>
                     <target>1.8</target>
                 </configuration>
             </plugin>
             <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <version>0.7.9</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>prepare-agent</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>report</id>
+                        <phase>test</phase>
+                        <goals>
+                            <goal>report</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <version>2.16</version>
                 <configuration>
                     <includes>
                         <include>**/Test*.java</include>
                         <include>**/*Test.java</include>
                         <include>**/*Tests.java</include>
@@ -32,9 +54,15 @@
     </build>
     <dependencies>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.12</version>
         </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>2.5.5</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

我想删除最后一个具有 Mockito 依赖项的块。如果我只是删除这些行本身,它总是会给我一个错误报告到第 64 行:

fatal: corrupt patch at line 64
fatal: Could not apply '.git/ADD_EDIT.patch'

第 64 行是补丁文件的最后一行,所以 <project>.

解决方案是简单地移除整个主干,因此从@@-line 向下的所有内容都可以立即工作。

我希望这有帮助。

于 2017-04-03T18:33:35.403 回答
1

我遇到了同样的问题,终于弄清楚是什么问题了。我的一些行用制表符而不是空格缩进。将我所有的缩进更改为空格后,它起作用了。

于 2019-01-26T16:28:25.927 回答
1

我想删除最后一个具有 Mockito 依赖项的块。
如果我只是删除这些行本身,它总是会给我一个错误报告到第 64 行:

fatal: corrupt patch at line 64
fatal: Could not apply '.git/ADD_EDIT.patch'

您现在(2019 年第一季度)在 Git 2.21+ 上不会看到这种错误,因为在 2.21 之前,git add -e当它想让用户编辑的更改小于临时文件中遗留的先前更改时,“”会感到困惑.

add --edit: 截断补丁文件

如果已经有一个.git/ADD_EDIT.patch文件,我们无法正确截断它,这可能会导致非常有趣的错误。

当然,这个文件不应该随便乱放。
但至少在一种情况下,有一个过时的副本,大于当前的差异。所以结果是一个损坏的差异。

让我们在编写文件时截断文件,不要太担心它。

于 2019-02-23T21:30:41.243 回答
0

好的,抱歉没有仔细检查。

我尝试像往常一样添加和提交,但没有 Git-GUI,使用命令行,并且它有效。

因此,我建议每个对 Git-GUI 有问题的人不要像我那样做,并在发布之前通过命令行检查它。

于 2013-08-09T10:04:54.700 回答