IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Instal·lació

El paquet que instal·la la comanda patch, té el mateix nom que la comanda, tal i com podeu veure amb:

$ which patch
patch:/usr/bin/patch
$ dpkg -S /usr/bin/patch

Per tant per instal·lar-ho (si és que encara no ho teniu):

$ sudo apt-get install patch

Exemples

Aplicar un pegat

Suposant que el fitxer de diff esta en format uniffied (i aleshores el nom del fitxer al qual s'aplica el pegat està a l'interior del fitxer .diff)

$ patch < drblpush.diff 
IMPORTANT: Patch no canvia el nom al fitxer al qual se li aplica el pegat. Tampoc crea una copia de l'original (a no ser que s'especifiqui la 
opció -b), tot i que sempre es pot desaplicar un pegat amb la opció -R.

El fitxer del pegat especifica els fitxers als quals s'aplica el canvi. Per exemple:

<source lang="Diff">

--- drblpush.orig	2009-05-29 12:35:56.000000000 +0200
+++ drblpush	2009-05-30 11:43:37.000000000 +0200
@@ -1560,9 +1560,14 @@
   print "$lang_deploy{\"server_kernel_nfsd_support\"} ".
         colored ("NFS over $nfs_protocol_uc", "$color_warn").
         "!\n".
-        colored ("$lang_deploy{\"change_kernel_notes\"}\n", "$color_warn").
-        "$lang_deploy{\"press_enter_to_continue\"}";
-        chomp($line=<STDIN>);
+        colored ("$lang_deploy{\"change_kernel_notes\"}\n", "$color_warn");
+        
+        #Patch proposed by Sergi Tur
+        if ( ! $force_deploy) {
+          print "$lang_deploy{\"press_enter_to_continue\"}";
+          chomp($line=<STDIN>);
+        }
+        
   print "$delimiter{\"dash_line\"}\n";
 
   #
@@ -3120,7 +3125,7 @@
 fi
 echo "done!"
...

</source>

On:

--- drblpush.orig És el fitxer al que se li aplica el pegat.

Si el fitxer no existeix, ens donarà el següent error:

can't find file to patch at input line 3
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|--- drblpush.orig	2009-05-29 12:35:56.000000000 +0200
|+++ drblpush	2009-05-30 11:43:37.000000000 +0200
--------------------------

I ens preguntarà el nom del fitxer al qual volem aplicar el pegat

File to patch: 

Podem indicar el fitxer amb:

$ patch -b drblpush.orig < drblpush.diff 
patching file drblpush.orig

Una forma alternativa però equivalent seria:

$ patch -b drblpush.orig drblpush.diff 
patching file drblpush.orig


NOTA: És important fitxar-se si els noms dels fitxers als quals s'aplica el pegat són relatius o absoluts.

Aplicar un pegat fent una còpia de seguretat de l'original

Cal utilitzar la opció -b:

$ patch -b < drblpush.diff

La copia del fitxer original tindrà la extensió .orig.

Desfer l'aplicació d'un pegat

L'aplicació d'un pegat es pot desfer amb:

$ patch -R < mods.diff

Patch i patch absoluts

Al aplicar pegats a carpetes senceres, cal tenir en compte el paràmetre -p. Aquest paràmetre indica que a l'hora d'aplicar el pegat, el fitxers als quals se'ls hi ha d'aplicar el pegat poden tenir path diferents als que tenien en la carpeta original on es va crear el path.

Sovint la opció:

$ patch -p1 < baz.patch

Ja aplica el patch correctament. Imagineu-vos però que al fitxer pegat s'indiquen patch de fitxers com:

/users/stephen/package/src/net/http.c

I nosaltres estem a una carpeta on el fitxer al qual volem aplicar el pegat està a:

net/http.c

Aleshores hauriem d'augmentar el nivell de la opció p amb:

$ patch -p5 < baz.patch

Execució sense aplicar els canvis (test o prova)

$ patch --dry-run -b drblpush.orig drblpush.diff 
patching file drblpush.orig

Si els canvis no són aplicables veurem errors similars a:

patching file TbCard.cpp
Hunk #2 FAILED at 585.
1 out of 2 hunks FAILED -- saving rejects to file TbCard.cpp.rej
patching file TbCard.h
Hunk #1 FAILED at 57.
Hunk #2 FAILED at 77.
Hunk #3 succeeded at 83 with fuzz 1 (offset -21 lines).


Vegeu també

Enllaços externs