如何应用简单补丁(反向检测)

如何应用简单补丁(反向检测)

我正在尝试创建并应用一个简单的补丁来修复与 gradle 相关的错误

我将文件 (/usr/bin/gradle) 复制到我的工作目录,然后进行更改。然后我创建补丁:

diff -u /usr/bin/gradle gradle > gradle.patch

然后我尝试应用它:

sudo patch < gradle.patch
Reversed (or previously applied) patch detected!  Assume -R? [n]

如果我无论如何继续,它就会失败。我尝试过生成颠倒文件的补丁,在这种情况下,它“成功”应用,但什么也不做。

生成的补丁如下所示:

--- /usr/bin/gradle 2013-09-09 16:47:58.000000000 -0400
+++ gradle  2015-10-13 11:39:36.005269565 -0400
@@ -67,7 +67,8 @@

 CLASSPATH=$APP_HOME/lib/gradle-launcher-1.4.jar

-export JAVA_HOME=/usr/lib/jvm/default-java
+# commenting out as per (https://stackoverflow.com/a/22309017)
+# export JAVA_HOME=/usr/lib/jvm/default-java

 # Determine the Java command to use to start the JVM.
 if [ -n "$JAVA_HOME" ] ; then

我尝试将补丁顶部的文件路径编辑为 /usr/bin/gradle,但这没有帮助。

我也尝试过传递 -p0,在这种情况下它给出:

Ignoring potentially dangerous file name /usr/bin/gradle
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- /usr/bin/gradle    2013-09-09 16:47:58.000000000 -0400
|+++ /usr/bin/gradle    2015-10-13 11:39:36.005269565 -0400
--------------------------
File to patch: /usr/bin/gradle
File /usr/bin/gradle is not a regular file -- refusing to patch
1 out of 1 hunk ignored -- saving rejects to file /usr/bin/gradle.rej

当我在这种情况下指定文件时,它仍然失败。

这似乎是一个简单的任务,我做错了什么?

答案1

您需要修补正确的文件。

按照您调用它的方式,它将尝试修补新文件,从而正确地假定反向修补程序。

尝试将旧版本的文件复制到当前目录,补丁将会应用。

关于您的-p0测试:您是否有权修改/usr/bin/gradle?您是否有权在/usr/bin 中创建文件?

另请注意,获取要修补的文件名有不同的规则。

使用的规则gpatch与原始补丁和 POSIX 补丁标准都不同。

请注意,“不是常规文件”消息特定于gpatch.请列出该文件/usr/bin/gradle。仅当文件不是常规文件时才会打印该消息,因此有些东西看起来很奇怪。

所以解决办法是:

patch只修补普通文件,但您要修补的文件是符号链接。

如果您当前目录中有普通(旧版本)文件的副本,则补丁将执行您所期望的操作。

顺便说一句:获取要修补的文件名的通常规则是查找最短的名称,因为通常的命名约定是使用:

file.orig

file

相关内容