11.6.2005

Patch anwenden/erstellen

default

 

Einen Patch erstellen

Man hat z.B. in einem Paket einen Fehler, ein Problem, einen Bug gefunden und beseitigt, und man möchte aus der Änderung einen Patch machen, so daß jemand anders sich ebenfalls das Paket herunterladen und mit Hilfe des Patches dieselbe Änderung vornehmen kann.

Nehmen wir als Beispiel blfs-dependencies.tar.gz (der ist so schön klein). Man hat ihn z.B. heruntergeladen nach /tmp und entpackt ihn z.B. nach /install/build:

cd /install/build
tar -xzf /tmp/blfs-dependencies.tar.gz

Dann hat man folgende Dateistruktur:

source-tarballs1

Angenommen, in der Datei depsort.c fehle in Zeile 319 ein äußerst wichtiger Kommentar. Dann kopiert man den ganzen Baum depsort6 nach depsort6.old:

cp -a depsort6 depsort6.old

Dann hat man:

source-tarballs2

Dann ändert man depsort6/depsort.c, Zeile 319 (die Leerzeile in der Mitte) von:


  sprintf(outstr, "%s (missing '%s')", pkg, depword);
  str_append(&result, outstr);
}

if(!isimp)
{
  if(str_pos(&done, depword) < 0)

nach:


  sprintf(outstr, "%s (missing '%s')", pkg, depword);
  str_append(&result, outstr);
}
/* aeusserst wichtiger Kommentar */
if(!isimp)
{
  if(str_pos(&done, depword) < 0)

 

Den Patch macht man dann so:

cd /install/build
diff -Naur depsort6.old/depsort.c depsort6/depsort.c >depsort6-kommentar.patch

Datei /install/build/depsort6-kommentar.patch:

--- depsort6.old/depsort.c 2003-09-24 11:43:12.000000000 +0200
+++ depsort6/depsort.c 2005-03-30 10:41:33.000000000 +0200
@@ -316,7 +316,7  
  sprintf(outstr, "%s (missing '%s')", pkg, depword);
  str_append(&result, outstr);
}
-
+/* aeusserst wichtiger Kommentar */
if(!isimp)
{
  if(str_pos(&done, depword) < 0)

Im Patch steht: "Man kommt von depsort6.old/depsort.c nach depsort6/depsort.c, indem man in Zeile 316 geht, dort die drei zitierten Zeilen überspringt, dann die Zeile mit dem Minuszeichen davor löscht, dafür die Zeile mit dem Pluszeichen einfügt, und dann wieder drei zitierte Zeilen Kontext überspringt.

Falls man mehrere Dateien geändert hat, macht man den Patch so:

diff -Naur depsort6.old/ depsort6/ >depsort6-xyz.patch

 

Einen Patch anwenden

Angenommen, man hat den obigen Tarball heruntergeladen und den Patch, man hat den Tarball - wie oben - nach /install/build entpackt und den Patch nach /install/build kopiert:

source-tarballs3

Dann befindet man sich normalerweise in /install/build/depsort6 (um dort z.B. ./configure ; make ; make install aufzurufen). Vorher wendet man aber den Patch an:

cd /install/build/depsort6
patch -Np1 -i ../depsort6-kommentar.patch

  • N bedeutet: "Patch in der Richtung ausführen, wie es im Patch steht, auch wenn es so aussieht, als ob es nicht stimmt."
  • p1 bedeutet: "vom vorderen Ende des Dateipfads ein Stück abschneiden, das einen Slash enthält" (also in diesem Falle: "depsort6.old/" bzw. "depsort6/"). Das ist hier nötig, weil der Patch von "build" aus gemacht wurde, aber wir sind jetzt eine Ebene tiefer drin.
  • i bedeutet: "Der Patchfile heißt:"
abatz.de Jörn Abatz - Technische Software Impressum