Come patchare un file (e creare patch) en Linux

Contenuti

PC che mostra un prompt della shell su un desktop Linux

El Linux patch Il comando consente di trasferire le modifiche da un set di file a un altro set di file in modo rapido e sicuro. Impara come usare patch il 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 trasferire rapidamente tutte le modifiche dal file modificato al file originale?? ecco dove patch e diff Vieni a giocare. patch e diff trovato su Linux e altri sistemi operativi simili a Unix, come macOS.

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

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

Ora immagina che questa procedura avvenga su un'intera directory di file di testo. Tutto in una volta. Questo è il potere di patch.

A volte non ti inviano file modificati. Tutto ciò che ti 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 veramente i tuoi file?? Oltre ad essere quasi uno scioglilingua, è anche una bella domanda. Ti guideremo in questo post.

il patch Il comando è più spesso utilizzato da persone che lavorano con file di codice sorgente del software., ma funziona ugualmente bene con qualsiasi set di file di testo, qualunque sia il tuo obiettivo, codice sorgente o no.

IMPARENTATO: Come confrontare due file di testo nel terminale Linux

Il nostro scenario di esempio

In questa fase, siamo in una directory chiamata lavoro che contiene altre due directory. Uno si chiama lavoro, e l'altro si chiama più recente. La directory di lavoro contiene un insieme 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.

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

Trova le differenze tra due versioni di un file

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

Viene chiamato un file slang.c. Confronteremo la versione della directory di lavoro con quella della directory più recente.

il -u l'opzione (unificato) dado diff per elencare ulteriormente alcune delle righe di testo non modificate prima e dopo ciascuna delle sezioni modificate. Queste linee sono chiamate linee di contesto. Aiutano il patch individuare con precisione dove deve essere apportata una modifica nel file originale.

Forniamo i nomi dei file in modo che diff sapere quali file confrontare. Il file originale è elencato per primo, dopo il file modificato. Questo è il comando che diamo a diff:

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

diff produce un elenco di output che mostra le differenze tra i file. Se i file fossero identici, nessun risultato sarebbe incluso nell'elenco. Vedendo questo tipo di output da diff conferma che ci sono differenze tra le due versioni del file e che il file originale necessita di una patch.

Crea un file di patch

Per catturare queste differenze in un file di patch, usa il seguente comando. È lo stesso comando del precedente, con la partenza di diff reindirizzato a un file chiamato slang.patch.

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

Il nome del file di patch è arbitrario. Puoi chiamarlo come vuoi. Darle una extensión “.patches una buena idea; nonostante questo, chiarisci che tipo di file è.

Produrre patch agire sul file di patch e modificare il file di lavoro / slang.c, usa il seguente comando. il -u opzione (unificato) consente patch sappi che il file di patch contiene righe di contesto unificate. In altre parole, usiamo l'opzione -u con diff, quindi usiamo il -u opzione con patch.

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

Se tutto va bene, c'è solo una linea di partenza che te lo dice patch sta patchando il file.

Fai un backup del file originale

Possiamo istruire patch per eseguire un backup dei file con patch prima che vengano modificati tramite il -b opzione (backup). il -i L'opzione (iscrizione) dice alla patch il nome del file di patch da usare:

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

Il file è patchato come prima, nessuna differenza visibile nell'output. Nonostante questo, se guardi la cartella di lavoro, vedrai che il file chiamato slang.c.orig è stato creato. La data e l'ora del file mostrano che slang.c.orig è il file originale e slang.c è un nuovo file creato da patch.

Utilizzo di diff con le directory

Possiamo usare diff per creare un file di patch contenente tutte le differenze tra i file in due directory. Quindi possiamo usare quel file di patch con patch in modo che queste differenze vengano applicate ai file nella cartella di lavoro con un singolo comando.

Le alternative che useremo con diff sono i -u (contesto unificato) che abbiamo usato in precedenza, il -r (ricorsivo) opzione da fare diff cerca in qualsiasi sottodirectory e il -N (nuovo file) opzione.

il -N opzione dice diff come gestire i file nella directory più recente che non si trovano nella directory di lavoro. Forza diff inserire le istruzioni nel file di patch in modo chepatch crea file che sono presenti nell'ultima directory ma mancano dalla directory di lavoro.

Puoi raggruppare le alternative per utilizzare un singolo script (-).

Si prega di notare che forniamo solo i nomi delle directory, non stiamo dicendo diff per guardare file specifici:

diff -ruN working/ latest/ > slang.patch

slang.patch” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(questo);” onerror=this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(questo);”>

Echando un vistazo dentro del archivo de parche

Diamo una rapida occhiata al file di patch. noi useremo less per vedere il suo contenuto.

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

Scorrendo il file della patch, vediamo che in seguito descrive le modifiche in un altro file chiamato structs.h. Ciò verifica che il file di patch contenga sicuramente le differenze tra le diverse versioni dei vari file.

Guarda prima di saltare

Patchare una grande raccolta di file può essere un po' sconcertante, quindi useremo il --dry-run opzione per verificare che tutto sia a posto prima di eseguire il passaggio e impegnarsi ad apportare le modifiche.

il --dry-run opzione dice patch fare tutto, a parte modificare i file. patch eseguirà tutti i controlli pre-volo su file e, se trovi qualche problema, informerà. Comunque, nessun file viene modificato.

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

il -d (directory) opzione dire patch in quale directory lavorare.

Si prega di notare che siamo no usando il -i (iscrizione) possibilità di contare patch quale file di patch contiene le istruzioni per diff. Anziché, stiamo reindirizzando il file di patch a patch insieme a <.

patch --dry-run -ruN -d funzionante < slang.patch

Dall'intera directory, diff Ho trovato due file da patchare. Le istruzioni relative alle modifiche per questi due file sono state verificate da patch e non sono stati segnalati problemi.

I controlli pre-volo vanno bene; siamo pronti a decollare.

Patch di una directory

Per applicare veramente le patch ai file usiamo il comando sopra senza il --dry-run opzione.

patch -ruN -d funzionante < slang.patch

Questa volta, cada línea de salida no comienza concomprobación”, cada línea comienza conparcheo”.

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

Risolvi le tue divergenze

Questo è, con molto, il modo più semplice e sicuro per usare patch. Copia i file di destinazione in una cartella e applica la patch a quella cartella. Copiali di nuovo quando sei soddisfatto che la procedura di patch sia stata completata senza errori.

impostaTimeout(funzione(){
!funzione(F,B,e,v,n,T,S)
{Se(f.fbq)Restituzione;n=f.fbq=funzione(){n.callMethod?
n.callMethod.apply(n,argomenti):n.queue.push(argomenti)};
Se(!f._fbq)f._fbq = n;n.push=n;n.loaded=!0;n.version='2.0′;
n.coda=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(T,S) } (window, documento,'copione',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('dentro', '335401813750447');
fbq('traccia', 'Visualizzazione della pagina');
},3000);

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.