Antworten:
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
oder diff ../old/foo foo >my.patch
oder diff 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 sich patch
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:
-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
-p0
gibt den gesamten Dateinamen unverändert ,-p1
gibtu/howard/src/blurfl/blurfl.c
ohne den führenden Schrägstrich ,
-p4
gibtblurfl/blurfl.c
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 :
/Barack/Obama
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):
Barack/Obama
-p2
entfernt Barack (und den angrenzenden rechten Schrägstrich):
Obama
patch
Lesen Sie diesen Thread, um das "Warum" dieses Verhaltens zu erläutern .