Comanda Linux `patch` facilitează transferul modificărilor între seturi de fișiere într-un mod eficient și sigur. Descoperă cum să utilizezi `patch` printr-o abordare simplificată.
Funcționalitatea comenzilor `patch` și `diff`
Imaginează-ți că deții un fișier text pe computerul tău. Primești o versiune actualizată a acelui fișier de la o altă persoană. Cum poți aplica rapid toate modificările din versiunea nouă la cea originală? Aici intervin `patch` și `diff`. Aceste comenzi sunt disponibile în Linux și alte sisteme de operare de tip Unix, cum ar fi macOS.
Comanda `diff` analizează două variante ale aceluiași fișier și evidențiază diferențele dintre ele. Aceste diferențe pot fi stocate într-un fișier separat, denumit fișier `patch`.
Comanda `patch` interpretează un fișier `patch`, folosind conținutul său ca pe un set de instrucțiuni. Conform acestor instrucțiuni, modificările din fișierul actualizat sunt aplicate fișierului original.
Acum gândește-te că acest proces are loc într-un întreg director plin de fișiere text, toate dintr-o singură operațiune. Asta este puterea comenzii `patch`.
Uneori, nu primești fișierele modificate, ci doar fișierul `patch`. De ce să trimiți un număr mare de fișiere când poți distribui un singur fișier?
Cum utilizezi acest fișier pentru a corecta fișierele? Acesta este un aspect important pe care îl vom clarifica în acest articol.
Comanda `patch` este frecvent folosită de dezvoltatorii de software pentru fișierele de cod sursă, dar funcționează eficient și cu orice tip de fișiere text, indiferent de natura lor, cod sursă sau nu.
Exemplu practic
În exemplul nostru, ne aflăm într-un director numit `work`, care conține două subdirectoare: `working` și `latest`. Directorul `working` conține o serie de fișiere de cod sursă, iar directorul `latest` deține cea mai recentă versiune a acestor fișiere, unele fiind modificate.
Pentru siguranță, directorul `working` este o copie a versiunii curente a fișierelor, nu singura copie existentă.
Identificarea diferențelor dintre versiuni
Comanda `diff` este folosită pentru a identifica diferențele dintre două fișiere. În mod implicit, afișează în terminal liniile care au fost modificate.
Unul dintre fișiere se numește `slang.c`. Vom compara versiunea din directorul `working` cu cea din directorul `latest`.
Opțiunea `-u` (unificată) permite comenzii `diff` să afișeze și liniile de text nemodificate care preced și urmează fiecare secțiune modificată. Aceste linii, denumite linii de context, ajută comanda `patch` să determine cu precizie locul în care trebuie aplicată o modificare în fișierul original.
Specificăm numele fișierelor pentru ca `diff` să știe ce fișiere să compare. Fișierul original este listat primul, urmat de fișierul modificat. Iată comanda pe care o vom folosi:
diff -u working/slang.c latest/slang.c
Comanda `diff` generează o listă care indică diferențele dintre fișiere. Dacă fișierele ar fi identice, nu ar exista niciun rezultat. Această ieșire confirmă existența diferențelor și necesitatea corectării fișierului original.
Crearea unui fișier `patch`
Pentru a stoca diferențele într-un fișier `patch`, folosim următoarea comandă. Este similară cu cea anterioară, dar redirecționează rezultatul `diff` într-un fișier numit `slang.patch`.
diff -u working/slang.c latest/slang.c > slang.patch
Dacă totul decurge corect, vom vedea o singură linie care confirmă aplicarea corecțiilor.
Crearea unei copii de rezervă
Putem instrui `patch` să creeze o copie de rezervă a fișierelor modificate, folosind opțiunea `-b` (backup). Opțiunea `-i` (input) indică numele fișierului `patch`:
patch -u -b working/slang.c -i slang.patch
Fișierul este corectat, fără modificări vizibile în rezultat. În directorul `working`, se va crea un fișier numit `slang.c.orig`. Timestamp-urile indică faptul că `slang.c.orig` este fișierul original, iar `slang.c` este fișierul modificat.
Utilizarea `diff` cu directoare
Putem utiliza `diff` pentru a genera un fișier `patch` care conține diferențele dintre toate fișierele din două directoare. Ulterior, putem aplica aceste modificări fișierelor din directorul `working` cu o singură comandă.
Opțiunile `diff` pe care le vom folosi sunt `-u` (context unificat), `-r` (recursivă) pentru a verifica subdirectoarele și `-N` (fișier nou).
Opțiunea `-N` indică `diff` cum să trateze fișierele din `latest` care nu se află în `working`. Astfel, `diff` include în fișierul `patch` instrucțiuni pentru ca `patch` să creeze fișierele prezente în `latest`, dar inexistente în `working`.
Opțiunile pot fi combinate folosind un singur `-`.
Reține că specificăm numele directoarelor, nu ale fișierelor:
diff -ruN working/ latest/ > slang.patch
Partea de sus a fișierului prezintă diferențele dintre cele două versiuni ale fișierului `slang.c`.
Mai jos, fișierul `patch` descrie modificările pentru un alt fișier, `structs.h`, confirmând că include diferențele dintre multiple fișiere.
Verificare înainte de aplicare
Corectarea unui număr mare de fișiere poate fi riscantă, așa că vom folosi opțiunea `–dry-run` pentru a verifica dacă totul este în regulă înainte de a aplica efectiv modificările.
Opțiunea `–dry-run` simulează aplicarea `patch`, efectuând toate verificările, dar fără a modifica fișierele. Dacă apar erori, acestea sunt raportate.
Dacă nu există erori, putem repeta comanda fără `–dry-run` pentru a aplica modificările.
Opțiunea `-d` (director) indică directorul de lucru al comenzii `patch`.
În loc să folosim opțiunea `-i`, vom redirecționa fișierul `patch` către comandă.
patch --dry-run -ruN -d working < slang.patch
Dintre toate fișierele din director, `diff` a identificat două pentru corectare. Instrucțiunile privind modificările pentru aceste două fișiere au fost verificate de `patch` și nu s-au raportat probleme.
Verificările au fost finalizate cu succes, putem continua.
Aplicarea modificărilor
Pentru a aplica efectiv modificările, vom folosi comanda anterioară fără opțiunea `–dry-run`.
patch -ruN -d working < slang.patch
De data aceasta, fiecare linie afișată începe cu „patching” în loc de „checking”.
Nu s-au raportat erori. Putem compila codul sursă și vom avea cea mai recentă versiune a software-ului.
Rezolvarea conflictelor
Aceasta este cea mai simplă și sigură metodă de utilizare a `patch`. Copiază fișierele țintă într-un director și aplică modificările în acel director. Copiază-le înapoi când ești mulțumit că procesul de `patch` s-a finalizat fără erori.