Was ist der Unterschied zwischen den Argumenten -p0 und -p1 beim Patchen?

19

Was ist der Unterschied zwischen patch -p0und patch -p1?

Gibt es überhaupt einen Unterschied?

chrisjlee
quelle

Antworten:

23

Die gebräuchlichste Methode zum Erstellen eines Patches ist das Ausführen des diffBefehls 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 diffsieht 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_versionoder new_version) aus dem Dateinamen entfernt werden soll. Das -p1bedeutet: 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 diffwerden 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 -pOption erforderlich: patchVerwirft den gesamten Verzeichnisanteil der Dateinamen. Meistens benötigen Sie jedoch entweder -p0oder -p1, je nachdem, wie der Patch erstellt wurde.

Gilles 'SO - hör auf böse zu sein'
quelle
Das hat mich so lange verwirrt. Warum unterscheidet sich das Verhalten von Unterverzeichnissen nicht von -p0? Ich bin immer davon ausgegangen, dass -p0 der Standardwert ist, daher hatte ich immer Probleme, wenn es p0 sein sollte
Brydon Gibson,
@BrydonGibson Ich vermute, dass ursprünglich die Idee bestand, dass der Autor des Patches gleichgültig schreiben diff old/foo new/foo >my.patchoder diff ../old/foo foo >my.patchoder diff foo.old foo >my.patchund der Benutzer es anwenden könnte, patch <my.patchohne sich darum kümmern zu müssen, wie der Patch hergestellt wurde, und dann -pals Annehmlichkeit hinzugefügt wurde. Aber ich weiß eigentlich nicht, ob es sich patchum ein altes Dienstprogramm handelt und zu dem Zeitpunkt, als ich damit anfing -p0oder -p1bereits die gebräuchlichste Art war, es zu verwenden.
Gilles 'SO- hör auf böse zu sein'
16

Vom mann:

-pnum oder --strip=num Entfernen Sie das kleinste Präfix, das die Anzahl der führenden Schrägstriche enthält, von jedem in der Patch-Datei gefundenen Dateinamen. Eine Folge von einem oder mehreren benachbarten Schrägstrichen wird als ein einzelner Schrägstrich gezählt. Hiermit wird gesteuert, wie in der Patch-Datei gefundene Dateinamen behandelt werden, falls sich Ihre Dateien in einem anderen Verzeichnis befinden als die Person, die den Patch gesendet hat. Angenommen, der Dateiname in der Patch-Datei lautet:

 /u/howard/src/blurfl/blurfl.c

Einstellung -p0gibt den gesamten Dateinamen unverändert , -p1gibt

 u/howard/src/blurfl/blurfl.c

ohne den führenden Schrägstrich , -p4gibt

 blurfl/blurfl.c
Stéphane Gimenez
quelle
4

Der Unterschied besteht darin, dass die Zahl danach -pdie Anzahl der Pfadkomponenten angibt, die entfernt werden würden.

Sagen wir, wir haben einen Weg /Barack/Obama. Wenn Sie einen Patch mit dem -p0Argument ausführen, wird der Pfad wie folgt behandelt :

/Barack/Obama

Aber wir können den Pfad beim Patchen kürzen:

-p1das Entfernen Schrägstrich (beachten Sie, dass es Barack gerade jetzt, wird es ohne einen Schrägstrich links):

Barack/Obama

-p2 entfernt Barack (und den angrenzenden rechten Schrägstrich):

 Obama

patchLesen Sie diesen Thread, um das "Warum" dieses Verhaltens zu erläutern .

JohnDoea
quelle