Diff

如何應用簡單更新檔(反向檢測)

  • October 13, 2015

我正在嘗試創建並應用一個簡單的更新檔來修復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

當我在這種情況下指定文件時,它仍然失敗。

這似乎是一個簡單的任務,我做錯了什麼?

您需要修補正確的文件。

按照您的稱呼,它將嘗試修補新文件,從而正確地假定一個反向更新檔。

嘗試將舊版本的文件複製到您的目前目錄,更新檔將應用。

關於您的-p0測試:您是否有權修改 /usr/bin/gradle?您是否有權在 /usr/bin 中創建文件?

另請注意,獲取要修補的文件名有一些不同的規則。

使用的規則gpatch與原始更新檔和 POSIX 更新檔標準都不同。

請注意,“不是正常文件”消息特定於gpatch. 請列出文件/usr/bin/gradle。僅當文件不是正常文件時才列印該消息,因此看起來有些奇怪。

所以解決方案是:

patch僅修補純文件,但您要修補的文件是符號連結。

如果您在目前目錄中有一份普通(舊版本)文件的副本,patch 將按照您的預期進行。

順便說一句:獲取要修補的文件名的通正常則是尋找最短的名稱,因為通常的命名約定是使用:

file.orig

file

引用自:https://unix.stackexchange.com/questions/235864