Wie kann ich einen -p0-Patch aus einem beliebigen Arbeitsverzeichnis anwenden?

26

Ich habe einen Patch mit absoluten Pfaden, die ich verwenden möchte. dh die ersten paar Zeilen lauten wie folgt.

--- /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml  2014-10-10 18:47:23.000000000 +1100
+++ /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod  2014-11-11 09:44:17.786200477 +1100

Es schlägt jedoch fehl, wenn ich mich nicht im Stammverzeichnis befinde.

~$ cd
~$ sudo patch -i /tmp/fix_kde_icons.patch -p0
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
...
~$ cd /tmp
/tmp$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/tmp$ cd /usr
/usr$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/usr$ cd /
/$ sudo patch -i /tmp/fix_kde_icons.patch -p0
patching file /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml

Gibt es eine Möglichkeit, patchden absoluten Pfad für jedes Arbeitsverzeichnis zu verwenden?

Sparhawk
quelle
Ich würde stattdessen den Patch selbst bearbeiten.
Braiam
@Braiam Welche spezifischen Änderungen würde ich am Patch vornehmen? Grundsätzlich frage ich mich, ob ich vermeiden kann, im patchBefehl Zielpfade angeben zu müssen .
Sparhawk
Bitte einen Zusammenhang. Versuchen Sie, diesen Patch auf ein laufendes System anzuwenden? Wenn ja warum? Was ist Ihre Distribution / Ihr Betriebssystem? Was macht dieser Patch? Es sieht aus wie ein Patch für eine KDE-Sache. Welche Komponente? Im Allgemeinen sollten Sie, wenn Ihre Distribution den Patch nicht für Sie anwendet, das entsprechende Paket aus dem Quellcode mit dem angewendeten Patch neu erstellen. Und Sie können den führenden Teil des Pfades abschneiden. Das sollte kein Problem sein. Wie viel Sie zuschneiden, hängt davon ab, wie die Quelle aussieht.
Faheem Mitha
1
@FaheemMitha Ja, es läuft mit Arch / KDE. Es ist, um diesen Fehler zu beheben . Das Update funktioniert, wenn ich Änderungen manuell übernehme. Ich denke jedoch nicht, dass der Kontext in diesem Fall so wichtig ist, da ich dieses Problem mit einer Testdatei in replizieren kann /tmp/foo. Ich bin mehr an einer generischen Antwort interessiert, die zutrifft patch.
Sparhawk

Antworten:

35

Wenn man sich den Quellcode des GNU-Patches ansieht, ist dieses Verhalten seit Version 2.7 eingebaut. Ab GNU-Patch 2.7.1 werden nur relative Pfade ..akzeptiert, die keine enthalten , es sei denn, das aktuelle Verzeichnis ist das Stammverzeichnis.

Mit können Sie einen Patch anwenden, der absolute Pfade enthält

(cd / && sudo patch -p0) <foo.patch

In neueren Versionen von GNU Patch können Sie einfach

sudo patch -d/ -p0 <foo.patch
Gilles 'SO - hör auf böse zu sein'
quelle
Okay, es ist was es ist. Wenn Sie jedoch meine Befehle überprüfen, ist dies cd /usrauch fehlgeschlagen, obwohl sich die Zieldateien in diesem Verzeichnis befinden.
Sparhawk
@Sparhawk Entschuldigung, meine Beschreibung war teilweise falsch. Der Test lautet: Wenn das aktuelle Verzeichnis nicht vorhanden ist /, lehnen Sie alle absoluten Pfade oder Pfade ab, die eine ..Komponente enthalten.
Gilles 'SO- hör auf böse zu sein'
7
Oder einfachersudo patch -d/ -p0 <foo.patch
Qian
@TheoYou Ich habe diesen Kommentar zu der Zeit verpasst. Sie sollten es als Antwort aufschreiben.
Sparhawk