GNU/Linux >> Linux Esercitazione >  >> Linux

Collabora su un file usando Linux diff e patch

Modifico molti file di testo. A volte è codice. Altre volte è la parola scritta per giochi di ruolo (RPG), libri di programmazione o corrispondenza generale. A volte è bello apportare una modifica, ma per il mio collaboratore confrontare la mia modifica con ciò che avevano originariamente scritto. Molte persone utilizzano le suite per ufficio, come LibreOffice, utilizzando i commenti o le funzionalità di rilevamento delle modifiche. A volte uno strumento più semplice ha più senso, tuttavia, e per questo, puoi guardare la cronologia di programmazione per strumenti come diff e patch , che forniscono una formattazione standardizzata per tenere traccia e applicare le modifiche ai file condivisi.

Più risorse Linux

  • Comandi Linux cheat sheet
  • Cheat sheet sui comandi avanzati di Linux
  • Corso online gratuito:Panoramica tecnica RHEL
  • Cheat sheet della rete Linux
  • Cheat sheet di SELinux
  • Cheat sheet dei comandi comuni di Linux
  • Cosa sono i container Linux?
  • I nostri ultimi articoli su Linux

Anche con un semplice file, la sincronizzazione di due documenti è complessa. Alcuni elementi vengono modificati, altri vengono lasciati soli, vengono aggiunti nuovi contenuti e alcuni rimangono gli stessi ma vengono spostati in posizioni diverse nel documento. È difficile replicare le modifiche senza accettare beatamente che tutte le modifiche siano ugualmente valide e sostituire il vecchio file con quello nuovo. È anche monoliticamente opaco. Ci sono così tante modifiche che è difficile individuare esattamente cosa è cambiato.

Con il diff comando, puoi creare un record di come è cambiato il file e con patch puoi "riprodurre" queste modifiche rispetto alla vecchia versione per aggiornarla con la nuova versione.

Configurazione

Supponiamo che io e te stiamo collaborando a un file che descrive come preparare una tazza di tè.



Finora, il file tea.md contiene copia-incolla grezza:

Boil water.
Warm the teapot.
Add tea and water to the teapot.
Place a tea cosy over the teapot.
Steep for 6 minutes.
Pour tea into cup.
Add milk.

Sembra ragionevole, ma ci sono sempre ottimizzazioni che puoi apportare, quindi inviami il file per migliorarlo. Nel tentativo di chiarire il processo di preparazione del tè, copio il file come tea-revision.md e modificalo, finendo con questo:

Warm a teapot in the proving drawer of your oven.
Boil water.
Add tea leaves to a tea strainer.
Add strainer and water to teapot.
Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
Optionally, add warm milk.

Come previsto, alcuni articoli (Boil water e Pour tea into cup ) sono invariate, mentre le altre righe (Warm the teapot ) hanno avuto aggiunte. Alcune righe sono completamente nuove e alcune righe sono le stesse ma in un ordine diverso.

Crea una differenza

Il diff lo strumento mostra la differenza tra due file. Esistono diversi modi per visualizzare i risultati, ma penso che il più chiaro sia il --unified (-u in breve) vista, che mostra quali linee sono state aggiunte o sottratte. Una linea che è stata modificata in qualche modo viene trattata come una linea che è stata sottratta e quindi aggiunta. Per impostazione predefinita, diff stampa il suo output sul terminale.

Fornisci diff con il vecchio file e poi il nuovo file:

$ diff --unified tea.md tea-revised.md 
--- tea.md      2021-11-13 10:26:25.082110219 +1300
+++ tea-revised.md      2021-11-13 10:26:32.049110664 +1300
@@ -1,7 +1,7 @@
+Warm a teapot in the proving drawer of your oven.
 Boil water.
-Warm the teapot.
-Add tea and water to the teapot.
-Place a tea cosy over the teapot.
-Steep for 6 minutes.
+Add tea leaves to a tea strainer.
+Add strainer and water to teapot.
+Steep for 6 minutes. Keep it warm with a tea cosy.
 Pour tea into cup.
-Add milk.
+Optionally, add warm milk.

Un segno più (+ ) all'inizio di una riga indica qualcosa che è stato aggiunto al vecchio file. Un segno meno (- ) all'inizio di una riga indica una riga che è stata rimossa o modificata.

Crea una patch con differenze

Un file di patch è solo l'output di diff --unified comando inserito in un file. Puoi farlo usando il reindirizzamento Bash standard:

$ diff -u tea.md tea-revised.md > tea.patch

Il contenuto del file è esattamente lo stesso di quello che è stato inviato al terminale. Mi piace visualizzare i file di patch in Emacs, che codifica a colori ogni riga a seconda che sia stata aggiunta o sottratta.

Applicazione delle modifiche con la patch

Una volta che avrò un file di patch, potrei inviartelo affinché tu possa esaminarlo e, facoltativamente, applicarlo al tuo vecchio file. Applichi una patch con la patch comando:

$ patch tea.md tea.patch

Le righe sono state aggiunte, le righe sono state sottratte e alla fine si ottiene un file identico alla mia versione:

$ cat tea.md
Warm a teapot in the proving drawer of your oven.
Boil water.
Add tea leaves to a tea strainer.
Add strainer and water to teapot.
Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
Optionally, add warm milk.

Non c'è limite al numero di patch che puoi applicare a un file. Potresti ripetere le mie modifiche, generare una nuova patch e inviarmela per la revisione. L'invio delle modifiche anziché dei risultati consente a ciascun collaboratore di rivedere ciò che è cambiato, decidere cosa desidera mantenere o eliminare e documentare accuratamente il processo.

Installa

Su Linux e macOS, hai già entrambi i diff e patch comandi. Su Windows, puoi ottenere diff e patch tramite Cygwin oppure utilizza Chocolatey per cercare diffutils e patch.

Se hai mai provato a collaborare su file tramite email o chat e ti sei ritrovato a provare a descrivere dove hai bisogno di una modifica, allora adorerai diff e patch . Un file strutturato con cura, come codice o Markdown delimitato da righe, è facile da differenziare, correggere e mantenere.


Linux
  1. Come decomprimere il formato di file .xz in Linux usando le utility tar e xz?

  2. Come crittografare e decrittografare file/cartelle in Linux usando GnuPG

  3. File system supportati e consigliati su Linux

  4. Come comprimere e decomprimere file .bz2 in Linux usando il comando bzip2

  5. Utilizzo di kbhit() e getch() su Linux

Come usare il comando diff di Linux

Come registrare e riprodurre sessioni del terminale Linux utilizzando i comandi "script" e "scriptreplay".

Tutto sui file tar e su come tar, untar file in Linux usando il terminale

Come cancellare in modo sicuro un disco e un file utilizzando il comando shred di Linux

Come nascondere cartelle e file in Linux usando un file di testo

Confronta due file in Linux – Usando diff, vimdiff e colordiff