So wenden Sie unter Linux einen Patch auf eine Datei an (und erstellen Patches)

Mit dem Linux-Befehl patch können Sie die Änderungen von einem Dateisatz auf einen anderen Dateisatz schnell und sicher übertragen. Erfahren Sie, wie Sie Patch auf einfache Weise verwenden.

Die patch- und diff-Befehle

Stellen Sie sich vor, Sie haben eine Textdatei auf Ihrem Computer. Sie erhalten eine modifizierte Version dieser Textdatei von einer anderen Person. Wie übertragen Sie schnell alle Änderungen aus der geänderten Datei in Ihre Originaldatei? Hier kommen Patch und Diff ins Spiel. patch und diff finden sich in Linux und anderen Unix-ähnlichen Betriebssystemen wie macOS.

Der diff-Befehl untersucht zwei verschiedene Versionen einer Datei und listet die Unterschiede zwischen ihnen auf. Die Unterschiede können in einer als Patch-Datei bezeichneten Datei gespeichert werden.

Der Befehl patch kann eine Patch-Datei lesen und den Inhalt als eine Reihe von Anweisungen verwenden. Wenn Sie diesen Anweisungen folgen, werden die Änderungen in der geänderten Datei im Original nachgebaut Datei.

Stellen Sie sich nun vor, dass dieser Prozess mit einem ganzen Verzeichnis von Textdateien passiert. Alles auf einen Schlag. Das ist die Macht von Patch.

Manchmal werden Ihnen die geänderten Dateien nicht gesendet. Sie erhalten lediglich die Patch-Datei. Warum Dutzende von Dateien verschicken, wenn Sie eine Datei senden oder eine Datei zum einfachen Download posten können?

Was tun Sie mit der Patch-Datei, um Ihre Dateien tatsächlich zu patchen? Abgesehen davon, dass es fast ein Zungenbrecher ist, ist das auch eine gute Frage. Wir führen Sie in diesem Artikel durch.

Der Befehl patch wird am häufigsten von Leuten verwendet, die mit Software-Quellcodedateien arbeiten, aber er funktioniert gleich gut mit jedem Satz von Textdateien, unabhängig von ihrem Zweck, Quellcode oder nicht.

Unser Beispielszenario

In diesem Szenario befinden wir uns in einem Verzeichnis namens work, das zwei weitere Verzeichnisse enthält. Einer heißt arbeiten und der andere heißt spät. Das Arbeitsverzeichnis enthält eine Reihe von Quellcodedateien. Das neueste Verzeichnis enthält die neueste Version dieser Quellcodedateien, von denen einige modifiziert wurden.

Sicherheitshalber ist das Arbeitsverzeichnis eine Kopie der aktuellen Version der Textdateien. Es ist nicht die einzige Kopie von ihnen.

  So installieren Sie das Toffee GTK-Design unter Linux

Finden der Unterschiede zwischen zwei Versionen einer Datei

Der Befehl diff findet die Unterschiede zwischen zwei Dateien. Die Standardaktion besteht darin, die geänderten Zeilen im Terminalfenster aufzulisten.

Eine Datei heißt slang.c. Wir vergleichen die Version im Arbeitsverzeichnis mit der im neuesten Verzeichnis.

Die Option -u (unified) weist diff an, auch einige der unmodifizierten Textzeilen vor und nach jedem der geänderten Abschnitte aufzulisten. Diese Zeilen werden Kontextzeilen genannt. Sie helfen dem Patch-Befehl, genau zu lokalisieren, wo eine Änderung in der Originaldatei vorgenommen werden muss.

Wir geben die Namen der Dateien an, damit diff weiß, welche Dateien zu vergleichen sind. Die Originaldatei wird zuerst aufgelistet, dann die geänderte Datei. Dies ist der Befehl, den wir an diff ausgeben:

diff -u working/slang.c latest/slang.c

diff erzeugt eine Ausgabeliste, die die Unterschiede zwischen den Dateien zeigt. Wenn die Dateien identisch wären, würde überhaupt keine Ausgabe aufgelistet. Wenn Sie diese Art von Ausgabe von diff sehen, wird bestätigt, dass es Unterschiede zwischen den beiden Dateiversionen gibt und dass die Originaldatei gepatcht werden muss.

Erstellen einer Patch-Datei

Verwenden Sie den folgenden Befehl, um diese Unterschiede in einer Patch-Datei zu erfassen. Es ist der gleiche Befehl wie oben, wobei die Ausgabe von diff in eine Datei namens slang.patch umgeleitet wird.

diff -u working/slang.c latest/slang.c > slang.patch

diff -u working/slang.c Latest/slang.c > slang.patch in einem Terminalfenster“ width=“646″ height=“57″ onload=“pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);“  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Der Name der Patch-Datei ist willkürlich.  Sie können es nennen, wie Sie möchten.  Es ist eine gute Idee, ihm die Erweiterung „.patch“ zu geben.  Da es jedoch deutlich macht, um welchen Dateityp es sich handelt.</p>
<p>Um Patch auf die Patch-Datei einwirken zu lassen und die Datei working/slang.c zu ändern, verwenden Sie den folgenden Befehl.  Die Option -u (unified) teilt Patch mit, dass die Patch-Datei einheitliche Kontextzeilen enthält.  Mit anderen Worten, wir haben die Option -u mit diff verwendet, also verwenden wir die Option -u mit patch.</p>
<div style=

patch -u working.slang.c -i slang.patch

Wenn alles gut geht, gibt es eine einzige Ausgabezeile, die Ihnen mitteilt, dass patch die Datei patcht.

Erstellen einer Sicherungskopie der Originaldatei

Wir können patch anweisen, eine Sicherungskopie der gepatchten Dateien zu erstellen, bevor sie geändert werden, indem wir die Option -b (Backup) verwenden. Die Option -i (input) teilt patch den Namen der zu verwendenden Patch-Datei mit:

patch -u -b working.slang.c -i slang.patch

Die Datei wird wie zuvor gepatcht, ohne sichtbaren Unterschied in der Ausgabe. Wenn Sie jedoch in den Arbeitsordner schauen, sehen Sie, dass die Datei slang.c.orig erstellt wurde. Die Datums- und Zeitstempel der Dateien zeigen, dass slang.c.orig die Originaldatei und slang.c eine von Patch neu erstellte Datei ist.

Verwenden von diff mit Verzeichnissen

Wir können diff verwenden, um eine Patch-Datei zu erstellen, die alle Unterschiede zwischen den Dateien in zwei Verzeichnissen enthält. Wir können dann diese Patch-Datei mit patch verwenden, um diese Unterschiede mit einem einzigen Befehl auf die Dateien im Arbeitsordner anzuwenden.

Die Optionen, die wir mit diff verwenden werden, sind die Option -u (unified context), die wir zuvor verwendet haben, die Option -r (rekursiv), damit diff in allen Unterverzeichnissen sucht, und die Option -N (neue Datei).

Die Option -N teilt diff mit, wie mit Dateien im neuesten Verzeichnis umzugehen ist, die sich nicht im Arbeitsverzeichnis befinden. Es zwingt diff, Anweisungen in die Patch-Datei einzufügen, damit Patch Dateien erstellt, die im neuesten Verzeichnis vorhanden sind, aber im Arbeitsverzeichnis fehlen.

Sie können die Optionen zusammenfassen, sodass sie einen einzelnen Bindestrich (-) verwenden.

Beachten Sie, dass wir nur die Verzeichnisnamen angeben und diff nicht anweisen, sich bestimmte Dateien anzusehen:

diff -ruN working/ latest/ > slang.patch

diff -ruN working/latest/ > slang.patch“ width=“646″ height=“77″ onload=“pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);“  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<h2 role=Ein Blick in die Patch-Datei

Werfen wir einen kurzen Blick in die Patch-Datei. Wir werden weniger verwenden, um den Inhalt zu betrachten.

Der Anfang der Datei zeigt die Unterschiede zwischen den beiden Versionen von slang.c.

Wenn wir weiter nach unten durch die Patch-Datei scrollen, sehen wir, dass sie dann die Änderungen in einer anderen Datei namens structs.h beschreibt. Dadurch wird überprüft, ob die Patch-Datei definitiv die Unterschiede zwischen verschiedenen Versionen mehrerer Dateien enthält.

  So installieren Sie Linux auf einem Chromebook mit Crouton

Schauen Sie vor dem Sprung

Das Patchen einer großen Sammlung von Dateien kann ein wenig nervig sein, daher verwenden wir die Option –dry-run, um zu überprüfen, ob alles in Ordnung ist, bevor wir den Sprung wagen und uns verpflichten, die Änderungen vorzunehmen.

Die Option –dry-run weist Patch an, alles zu tun, außer die Dateien tatsächlich zu ändern. patch führt alle Preflight-Prüfungen der Dateien durch und meldet diese, wenn Probleme auftreten. Jedenfalls werden keine Dateien geändert.

Wenn keine Probleme gemeldet werden, können wir den Befehl ohne die Option –dry-run wiederholen und unsere Dateien getrost patchen.

Die Option -d (Verzeichnis) teilt Patch mit, an welchem ​​Verzeichnis gearbeitet werden soll.

Beachten Sie, dass wir die Option -i (input) nicht verwenden, um Patch mitzuteilen, welche Patch-Datei die Anweisungen von diff enthält. Stattdessen leiten wir die Patch-Datei mit in Patch um <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

Out of the entire directory, diff found two files to patch. The instructions regarding the modifications for those two files have been checked by patch , and no problems have been reported.

Pre-flight checks are OK; we’re ready for take-off.

Patching a Directory

To genuinely apply the patches to the files we use the previous command without the --dry-run option.

patch -ruN -d working 

This time each line of output doesn’t start with “checking,” each line starts with “patching.”

And no problems are reported. We can compile our source code, and we’ll be on the latest version of the software.

Settle Your Differences

This is by far the easiest and safest way to use patch. Copy your target files to a folder and patch that folder. Copy them back when you’re happy that the patching process completed error free.