Git错误:“致命:第36行的腐败补丁”

时间:2013-08-09 08:32:37

标签: git git-gui

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

    }
}

前段时间我错误地删除了换行符,但是直到今天我在提交时收到来自Git-GUI的错误信息都很好

fatal: corrupt patch at line 36

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

在添加换行符之前:

     }
 }
\ No newline at end of file

添加换行符后:

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

它仍然给我这个错误。

我尝试恢复更改并仅添加换行而不对文件进行其他更改,但它也没有帮助。

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

EDIT2:只有在最后一个大块内提交行时才会出现此错误。

7 个答案:

答案 0 :(得分:12)

当你编辑' - '线。
当你删除' - '并忘记添加' ' (空格)代替它

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

<强>更新

您的编辑器也可以选择:&#34;删除行尾的空格&#34;。因此,当您在编辑器中保存补丁时:

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

答案 1 :(得分:2)

commit对补丁没有任何作用。它甚至没有对其内容做任何事情。提交仅格式化树和提交对象,并调整HEAD和它指向的ref。因此,它不会提交自己产生此错误。

它也不是add,因为虽然它会散列新的文件内容,但它会对新内容进行操作,而根本不关心差异。

关注差异的唯一想法是默认的预提交挂钩,它会检查您是否没有添加尾随空格和几个类似的问题。您可以致电git commit --no-verify跳过该检查。但是你必须首先启用它,你可能知道它。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

  

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

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

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

  

add --edit:截断补丁文件

     

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

     

当然,不应将此文件留在身边。
  但是至少在一种情况下,存在一个陈旧的副本,大于当前的差异。所以   结果是差异差异。

     

让我们在编写文件时将其截断,而不必担心太多。

答案 4 :(得分:0)

好的,抱歉没有彻底检查。

我尝试按照通常的方式添加和提交,但是没有Git-GUI,使用命令行,它可以工作。

所以,我建议每个遇到Git-GUI问题的人不要像我那样做,并在发布前通过命令行查看。

答案 5 :(得分:0)

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

通过git add -e pom.xml修补我的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>

解决方案是简单地移除整个行李箱,所以从@@ - 行向下,所有行动都会立即生效。

我希望这会有所帮助。

答案 6 :(得分:0)

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

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

虽然我尚未对其进行任何实质性研究或曾经使用过git gui,但可以想象到,由于没有以换行符结尾的行在技术上并不是按照某些标准的行,因此您需要更改一个或将这两个数字都加一即可正确应用。