Come applicare una patch a un file (e creare patch) in Linux

Il comando patch di Linux consente di trasferire le modifiche da un set di file a un altro set di file in modo rapido e sicuro. Impara come usare le patch in modo semplice.

I comandi patch e diff

Immagina di avere un file di testo sul tuo computer. Ricevi una versione modificata di quel file di testo da qualcun altro. Come si trasferiscono rapidamente tutte le modifiche dal file modificato al file originale? È qui che entrano in gioco patch e diff. patch e diff si trovano in Linux e in altri sistemi operativi Unix-Like, come macOS.

Il comando diff esamina due diverse versioni di un file ed elenca le differenze tra loro. Le differenze possono essere memorizzate in un file chiamato file patch.

Il comando patch può leggere un file patch e utilizzare il contenuto come un insieme di istruzioni. Seguendo queste istruzioni, le modifiche nel file modificato sono replicato nell’originale file.

Ora immagina che il processo avvenga in un’intera directory di file di testo. Tutto in una volta. Questo è il potere della patch.

A volte non vengono inviati i file modificati. Tutto ciò che viene inviato è il file di patch. Perché inviare dozzine di file quando puoi inviare un file o pubblicare un file per un facile download?

Cosa fai con il file di patch per correggere effettivamente i tuoi file? Oltre ad essere quasi uno scioglilingua, questa è anche una bella domanda. Ti guideremo attraverso questo articolo.

Il comando patch viene spesso utilizzato da persone che lavorano con file di codice sorgente software, ma funziona ugualmente bene con qualsiasi set di file di testo indipendentemente dal loro scopo, codice sorgente o meno.

Il nostro scenario di esempio

In questo scenario, ci troviamo in una directory chiamata lavoro che contiene altre due directory. Uno si chiama lavoro e l’altro si chiama ultimo. La directory di lavoro contiene una serie di file di codice sorgente. L’ultima directory contiene la versione più recente di quei file di codice sorgente, alcuni dei quali sono stati modificati.

  Come impostare le priorità del processo con nice and renice su Linux

Per sicurezza, la directory di lavoro è una copia della versione corrente dei file di testo. Non è l’unica copia di loro.

Trovare le differenze tra due versioni di un file

Il comando diff trova le differenze tra due file. La sua azione predefinita è elencare le righe modificate nella finestra del terminale.

Un file si chiama slang.c. Confronteremo la versione nella directory di lavoro con quella nella directory più recente.

L’opzione -u (unificata) dice a diff di elencare anche alcune delle righe di testo non modificate prima e dopo ciascuna delle sezioni modificate. Queste righe sono chiamate righe di contesto. Aiutano il comando patch a individuare con precisione dove è necessario apportare una modifica nel file originale.

Forniamo i nomi dei file in modo che diff sappia quali file confrontare. Il file originale viene elencato per primo, quindi il file modificato. Questo è il comando che emettiamo per diff:

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

diff -u working / slang.s latest / slang.c in una finestra di terminale

diff produce un elenco di output che mostra le differenze tra i file. Se i file fossero identici, non ci sarebbe alcun output elencato. La visualizzazione di questo tipo di output da diff conferma che ci sono differenze tra le due versioni di file e che il file originale necessita di patch.

output da diff in una finestra di terminale

Creazione di un file di patch

Per catturare queste differenze in un file di patch, utilizzare il seguente comando. È lo stesso comando di cui sopra, con l’output di diff reindirizzato in un file chiamato slang.patch.

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

diff -u working / slang.c latest / slang.c> slang.patch in a terminal window “width =” 646 ″ height = “57” onload = “pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”  onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Il nome del file di patch è arbitrario.  Puoi chiamarlo come preferisci.  Dare un’estensione “.patch” è una buona idea;  tuttavia, poiché rende chiaro che tipo di file è. </p>
<div style=

Per fare in modo che patch agisca sul file patch e modifichi il file working / slang.c, utilizzare il seguente comando. L’opzione -u (unificata) consente a patch di sapere che il file di patch contiene righe di contesto unificate. In altre parole, abbiamo usato l’opzione -u con diff, quindi usiamo l’opzione -u con patch.

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

Se tutto va bene, c’è un’unica riga di output che ti dice che la patch sta correggendo il file.

Fare un backup del file originale

Possiamo indicare a patch di creare una copia di backup dei file con patch prima che vengano modificati utilizzando l’opzione -b (backup). L’opzione -i (input) dice a patch il nome del file di patch da usare:

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

patch -u working.slang.c -i slang.patch in una finestra di terminale

Il file è patchato come prima, senza differenze visibili nell’output. Tuttavia, se guardi nella cartella di lavoro, vedrai che il file chiamato slang.c.orig è stato creato. La data e l’ora dei file mostrano che slang.c.orig è il file originale e slang.c è un nuovo file creato da patch.

output di ls in una finestra di terminale

Utilizzo di diff con directory

Possiamo usare diff per creare un file patch che contiene tutte le differenze tra i file in due directory. Possiamo quindi utilizzare quel file patch con patch per applicare quelle differenze ai file nella cartella di lavoro con un singolo comando.

Le opzioni che useremo con diff sono l’opzione -u (contesto unificato) che abbiamo usato in precedenza, l’opzione -r (ricorsiva) per far cercare a diff in qualsiasi sottodirectory e l’opzione -N (nuovo file).

L’opzione -N dice a diff come gestire i file nell’ultima directory che non si trovano nella directory di lavoro. Forza diff a inserire le istruzioni nel file patch in modo che patch crei file presenti nell’ultima directory ma mancanti dalla directory di lavoro.

Puoi raggruppare le opzioni insieme in modo che utilizzino un solo trattino (-).

Nota che stiamo fornendo solo i nomi delle directory, non stiamo dicendo a diff di guardare file specifici:

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>
<div style=

Sbirciando all’interno del file della patch

Diamo una rapida occhiata al file della patch. Useremo meno per guardare i suoi contenuti.

meno slang.patch in una finestra di terminale

La parte superiore del file mostra le differenze tra le due versioni di slang.c.

less slang.patch che mostra la parte superiore di ile in una finestra di terminale

Scorrendo più in basso nel file patch, vediamo che descrive poi le modifiche in un altro file chiamato structs.h. Ciò verifica che il file di patch contenga definitivamente le differenze tra le diverse versioni di più file.

less slang.patch che mostra il centro del file in una finestra di terminale

Guarda prima di saltare

Applicare una patch a una vasta raccolta di file può essere un po ‘snervante, quindi useremo l’opzione –dry-run per verificare che tutto sia a posto prima di fare il grande passo e impegnarci ad apportare le modifiche.

L’opzione –dry-run dice a patch di fare tutto tranne che modificare effettivamente i file. patch eseguirà tutti i controlli pre-volo sui file e se incontra problemi, li segnala. In ogni caso, nessun file viene modificato.

Se non vengono segnalati problemi, possiamo ripetere il comando senza l’opzione –dry-run e correggere con sicurezza i nostri file.

L’opzione -d (directory) dice alla patch su quale directory lavorare.

Nota che non stiamo usando l’opzione -i (input) per dire a patch quale file di patch contiene le istruzioni di diff. Invece, stiamo reindirizzando il file patch in patch con <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

patch --dry-run -ruN -d working <slang.patch in una finestra di terminale

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 

patch -ruN -d funzionante <slang.patch in una finestra di terminale

Questa volta ogni riga di output non inizia con "controllo", ogni riga inizia con "patch".

E non vengono segnalati problemi. Possiamo compilare il nostro codice sorgente e saremo sull'ultima versione del software.

Risolvi le tue differenze

Questo è di gran lunga il modo più semplice e sicuro per usare la patch. Copiare i file di destinazione in una cartella e applicare la patch a quella cartella. Copiarli di nuovo quando sei felice che il processo di patch sia stato completato senza errori.