Antworten:
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.
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.
Vom mann:
-pnumoder--strip=numEntfernen 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.cEinstellung
-p0gibt den gesamten Dateinamen unverändert ,-p1gibtu/howard/src/blurfl/blurfl.cohne den führenden Schrägstrich ,
-p4gibtblurfl/blurfl.c
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 .