Patch¶
Definition¶
Ein Patch (engl. to patch = flicken, ausbessern) in der Bedeutung von Reparatur bzw. Nachbesserung) ist eine Korrekturauslieferung für Software oder Daten aus Endanwendersicht, um Fehler zu beheben.
Ausgangsdatei (das Original)¶
Beschränkungen.
Meinem Vater hat seiner gesagt:
Mein Vater hat noch Hasen gejagt,
Das ist dann eingegangen.
Ich habe noch Fische gefangen,
Nun sind die Teiche zugesetzt.
Du selbst, mein Sohn, fängst Vögel jetzt;
Deinem zukünftigen Sohne
Wird verpönet die Dohne.
Auszulassen den Jagetrieb,
Darf er noch fangen den Molkendieb;
Lebt einst dein Enkel auf Erden,
Wird das auch verboten werden.
Gespeichert als »gedicht.txt«
Zeiter Autor ergänzt¶
Beschränkungen.
===============
Meinem Vater hat seiner gesagt:
Mein Vater hat noch Hasen gejagt,
Das ist dann eingegangen.
Ich habe noch Fische gefangen,
Nun sind die Teiche zugesetzt.
Du selbst, mein Sohn, fängst Vögel jetzt;
Deinem zukünftigen Sohne
Wird verpönet die Dohne.
Auszulassen den Jagetrieb,
Darf er noch fangen den Molkendieb;
Lebt einst dein Enkel auf Erden,
Wird das auch verboten werden.
Anmerkungen
~~~~~~~~~~~
.. glossary::
Dohne Eine Dohne (oder auch Thone) ist eine Fangschlinge
unterschiedlicher Bauart, die vor allem in historischer Zeit zum
Fang von Singvögeln und Schnepfen verwendet wurde. `siehe auch
Wikipedia <http://de.wikipedia.org/wiki/Dohne>`_
Gespeichert als gedicht-pk.txt
Statt der geänderten Datei¶
Wie so oft werden Änderungen als Korrekturvorschläge eines Co-Autoren in einer neuen Datei verfasst und vom Autor in das Original eingepflegt. Was mit Prosatexten und Officedateien noch gut funktioniert, muss im Programmierumfeld automatisiert werden. Oft kommen auch viele kleine Änderungswünsche in schneller Folge.
Eine Lösung ist das Patchen von Dateien.
Diff: Was hat sich geändert¶
diff gedicht.txt gedicht-pk.txt
15a16,25
>
> Anmerkungen
> ~~~~~~~~~~~
>
> .. glossary::
>
> Dohne Eine Dohne (oder auch Thone) ist eine Fangschlinge
> unterschiedlicher Bauart, die vor allem in historischer Zeit zum
> Fang von Singvögeln und Schnepfen verwendet wurde. `siehe auch
> Wikipedia <http://de.wikipedia.org/wiki/Dohne>`_
Mit umschließenden Text¶
Der Schalter »-u« gibt eine bessere Orientierung, wo genau geändert wurde, in dem ein paar Zeile vor und hinter der Änderungen mit angezeigt werden.
diff -u gedicht.txt gedicht-pk.txt
Das sieht dann wie folgt aus:
--- gedicht.txt 2020-05-29 14:20:24.182447936 +0200
+++ gedicht-pk.txt 2020-05-29 14:21:30.455102851 +0200
@@ -13,3 +13,13 @@
Darf er noch fangen den Molkendieb;
Lebt einst dein Enkel auf Erden,
Wird das auch verboten werden.
+
+Anmerkungen
+~~~~~~~~~~~
+
+.. glossary::
+
+ Dohne Eine Dohne (oder auch Thone) ist eine Fangschlinge
+ unterschiedlicher Bauart, die vor allem in historischer Zeit zum
+ Fang von Singvögeln und Schnepfen verwendet wurde. `siehe auch
+ Wikipedia <http://de.wikipedia.org/wiki/Dohne>`_
Statt der ganzen Datei¶
Die komplette Datei mit allen Änderungen würde den Speicherbedarf sofort verdoppeln. Warum nicht einfach nur die Änderungen schicken?
Speichern wir das Ergebnis von diff in eine Datei, wobei der Name und die Endung der Datei beliebig sein kann, aber die Endung patch verrät schon, worum es sich handelt:
diff -u gedicht.txt gedicht-pk.txt > gedicht.patch
Den Patch einspielen¶
Und weil der Patch mit -u erstellt wurde muss er auch mit -u eingespielt werden.
patch -u gedicht.txt -i gedicht.patch
**Kontrolle**: Da beide Dateien nun identisch sind, sollte diff keine Ausgabe erzeugen.
diff gedicht.txt gedicht-pk.txt
Was ist, wenn etwas schief geht?¶
Absicherung durch ein Backup, oder dem Schalter »-b« :
patch -u -b gedicht.txt -i gedicht.patch
Der Autor hat nun folgende Dateien:
ls -al
-rw-r--r-- 1 p4k p4k 546 Mai 29 14:41 gedicht.patch
-rw-r--r-- 1 p4k p4k 752 Mai 29 14:45 gedicht.txt
-rw-r--r-- 1 p4k p4k 457 Mai 29 14:45 gedicht.txt.orig
Verzeichnisse einbeziehen¶
Das Patchen ist nicht auf einzelne Dateien beschränkt: Will man als Co-Autor alle Änderungen in Unterverzeichnissen und auch neue Dateien weitergeben verwendet man die Schalter »-r« und »-N«.
diff -urN alt/ neu/ > gedichte.patch
Probelauf¶
Bei vielen Änderungen kann natürlch etwas schief gehen, weshalb ein Probelauf nicht schaden kann:
patch --dry-run -ruN -d working < gedichte.patch