Was ist der Unterschied zwischen patch -p0
und patch -p1
?
Gibt es überhaupt einen Unterschied?
Die gebräuchlichste Methode zum Erstellen eines Patches ist das Ausführen des diff
Befehls oder des integrierten Befehls einer Versionskontrolle diff
. Manchmal vergleicht man nur zwei Dateien und läuft folgendermaßen ab diff
:
diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch
Dann erhalten Sie einen Patch, der Änderungen für eine Datei enthält und überhaupt keinen Dateinamen enthält. Wenn Sie diesen Patch anwenden, müssen Sie angeben, auf welche Datei Sie ihn anwenden möchten:
patch <alice_to_bob.patch version2_by_alice.txt
Oft werden zwei Versionen eines gesamten Projekts mit mehreren Dateien in einem Verzeichnis verglichen. Ein typischer Aufruf von diff
sieht so aus:
diff -ru old_version new_version >some.patch
Dann enthält der Patch Dateinamen, die in Kopfzeilen wie angegeben sind diff -ru old_version/dir/file new_version/dir/file
. Sie müssen angeben patch
, dass das Präfix ( old_version
oder new_version
) aus dem Dateinamen entfernt werden soll. Das -p1
bedeutet: Eine Verzeichnisebene entfernen.
In einigen Fällen enthalten die Kopfzeilen im Patch den Dateinamen direkt ohne Anlauf. Dies ist bei Versionskontrollsystemen üblich. Zum Beispiel cvs diff
werden Kopfzeilen erzeugt, die so aussehen diff -r1.42 foo
. In diesem Fall muss kein Präfix zum Entfernen angegeben werden -p0
.
In dem speziellen Fall, dass sich in den zu vergleichenden Bäumen keine Unterverzeichnisse befinden, ist keine -p
Option erforderlich: patch
Verwirft den gesamten Verzeichnisanteil der Dateinamen. Meistens benötigen Sie jedoch entweder -p0
oder -p1
, je nachdem, wie der Patch erstellt wurde.
diff old/foo new/foo >my.patch
oderdiff ../old/foo foo >my.patch
oderdiff foo.old foo >my.patch
und der Benutzer es anwenden könnte,patch <my.patch
ohne sich darum kümmern zu müssen, wie der Patch hergestellt wurde, und dann-p
als Annehmlichkeit hinzugefügt wurde. Aber ich weiß eigentlich nicht, ob es sichpatch
um ein altes Dienstprogramm handelt und zu dem Zeitpunkt, als ich damit anfing-p0
oder-p1
bereits die gebräuchlichste Art war, es zu verwenden.Vom mann:
quelle
Der Unterschied besteht darin, dass die Zahl danach
-p
die Anzahl der Pfadkomponenten angibt, die entfernt werden würden.Sagen wir, wir haben einen Weg
/Barack/Obama
. Wenn Sie einen Patch mit dem-p0
Argument ausführen, wird der Pfad wie folgt behandelt :Aber wir können den Pfad beim Patchen kürzen:
-p1
das Entfernen Schrägstrich (beachten Sie, dass es Barack gerade jetzt, wird es ohne einen Schrägstrich links):-p2
entfernt Barack (und den angrenzenden rechten Schrägstrich):patch
Lesen Sie diesen Thread, um das "Warum" dieses Verhaltens zu erläutern .quelle