Cum să aplicați un patch la un fișier (și să creați patch-uri) în Linux

Comanda Linux patch vă permite să transferați modificările de la un set de fișiere la alt set de fișiere rapid și în siguranță. Aflați cum să utilizați patch-ul într-un mod simplu.

Comenzile de patch și diff

Imaginați-vă că aveți un fișier text pe computer. Primiți o versiune modificată a acelui fișier text de la altcineva. Cum transferați rapid toate modificările din fișierul modificat în fișierul original? Acolo intră în joc patch-ul și diferența. patch-ul și diff se găsesc în Linux și alte sisteme de operare asemănătoare Unix, cum ar fi macOS.

Comanda diff examinează două versiuni diferite ale unui fișier și enumeră diferențele dintre ele. Diferențele pot fi stocate într-un fișier numit fișier patch.

Comanda patch poate citi un fișier patch și poate folosi conținutul ca un set de instrucțiuni. Urmând aceste instrucțiuni, modificările din fișierul modificat sunt replicat în original fişier.

Acum imaginați-vă că acest proces se întâmplă într-un întreg director de fișiere text. Toate într-o singură mișcare. Aceasta este puterea patch-ului.

Uneori nu vi se trimit fișierele modificate. Tot ce primești este fișierul de corecție. De ce să trimiți zeci de fișiere când poți trimite un fișier sau să postezi un fișier pentru descărcare ușoară?

Ce faceți cu fișierul de corecție pentru a vă corecta fișierele? În afară de faptul că este aproape un șofer, aceasta este și o întrebare bună. Vă vom prezenta în acest articol.

Comanda patch este folosită cel mai adesea de persoanele care lucrează cu fișiere de cod sursă software, dar funcționează la fel de bine cu orice set de fișiere text, indiferent de scopul lor, codul sursă sau nu.

Exemplul nostru de scenariu

În acest scenariu, ne aflăm într-un director numit work, care conține alte două directoare. Unul se numește lucru, iar celălalt se numește cel mai recent. Directorul de lucru conține un set de fișiere de cod sursă. Cel mai recent director deține cea mai recentă versiune a acelor fișiere de cod sursă, dintre care unele au fost modificate.

  Cum să sincronizați fișierele pe Linux cu Unison

Pentru a fi în siguranță, directorul de lucru este o copie a versiunii curente a fișierelor text. Nu este singura copie a acestora.

Găsirea diferențelor între două versiuni ale unui fișier

Comanda diff găsește diferențele dintre două fișiere. Acțiunea sa implicită este de a lista liniile modificate în fereastra terminalului.

Un fișier se numește slang.c. Vom compara versiunea din directorul de lucru cu cea din cel mai recent director.

Opțiunea -u (unificată) îi spune lui diff să listeze și unele dintre liniile de text nemodificate de înainte și după fiecare dintre secțiunile modificate. Aceste linii sunt numite linii de context. Ele ajută comanda patch să găsească exact unde trebuie făcută o modificare în fișierul original.

Oferim numele fișierelor, astfel încât diff să știe ce fișiere să compare. Fișierul original este listat mai întâi, apoi fișierul modificat. Aceasta este comanda pe care o lansăm pentru a diferi:

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

diff produce o listă de ieșire care arată diferențele dintre fișiere. Dacă fișierele ar fi identice, nu ar exista nicio ieșire listată. Vederea acestui tip de ieșire de la diff confirmă că există diferențe între cele două versiuni de fișiere și că fișierul original necesită corecție.

Crearea unui fișier de corecție

Pentru a captura acele diferențe într-un fișier de corecție, utilizați următoarea comandă. Este aceeași comandă ca mai sus, cu rezultatul de la diff redirecționat într-un fișier numit slang.patch.

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

diff -u working/slang.c latest/slang.c > slang.patch într-o fereastră de terminal” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Numele fișierului de corecție este arbitrar.  Îi poți numi cum vrei.  A-i oferi o extensie „.patch” este o idee bună;  totuși, deoarece clarifică ce tip de fișier este.</p>
<p>Pentru ca patch să acționeze asupra fișierului patch și să modifice fișierul de lucru/slang.c, utilizați următoarea comandă.  Opțiunea -u (unificat) îi informează pe patch că fișierul de corecție conține linii de context unificate.  Cu alte cuvinte, am folosit opțiunea -u cu diff, așa că folosim opțiunea -u cu patch.</p>
<div style=

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

Dacă totul merge bine, există o singură linie de ieșire care vă spune că patch-ul este corectarea fișierului.

Efectuarea unei copii de rezervă a fișierului original

Putem instrui patch-ul să facă o copie de rezervă a fișierelor corecţionate înainte ca acestea să fie modificate utilizând opţiunea -b (backup). Opțiunea -i (input) îi spune patch-ului numele fișierului de corecție de utilizat:

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

Fișierul este corectat ca înainte, fără nicio diferență vizibilă în rezultat. Cu toate acestea, dacă te uiți în folderul de lucru, vei vedea că fișierul numit slang.c.orig a fost creat. Marcajele cu data și oră ale fișierelor arată că slang.c.orig este fișierul original și slang.c este un fișier nou creat de patch.

Folosind diff cu directoare

Putem folosi diff pentru a crea un fișier patch care conține toate diferențele dintre fișierele din două directoare. Apoi putem folosi acel fișier de corecție cu patch pentru a aplica acele diferențe fișierelor din folderul de lucru cu o singură comandă.

Opțiunile pe care le vom folosi cu diff sunt opțiunea -u (context unificat) pe care am folosit-o mai devreme, opțiunea -r (recursivă) pentru a face diff să se uite în orice subdirectoare și opțiunea -N (fișier nou).

Opțiunea -N îi spune lui diff cum să gestioneze fișierele din cel mai recent director care nu se află în directorul de lucru. O obligă pe diff să pună instrucțiuni în fișierul de corecție, astfel încât patch-ul să creeze fișiere care sunt prezente în cel mai recent director, dar lipsesc din directorul de lucru.

Puteți grupa opțiunile împreună, astfel încât acestea să utilizeze o singură cratimă (-).

Rețineți că furnizăm doar numele directoarelor, nu îi spunem lui diff să se uite la anumite fișiere:

diff -ruN working/ latest/ > slang.patch

diff -ruN de lucru/ latest/ > slang.patch” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<div style=

Privire în interiorul fișierului de corecție

Să aruncăm o privire rapidă în fișierul de corecție. Vom folosi mai puțin pentru a ne uita la conținutul său.

Partea de sus a fișierului arată diferențele dintre cele două versiuni de slang.c.

Derulând mai în jos prin fișierul de corecție, vedem că acesta descrie apoi modificările dintr-un alt fișier numit structs.h. Acest lucru verifică că fișierul de corecție conține cu siguranță diferențele dintre diferitele versiuni ale mai multor fișiere.

Nu te pripi

Corectarea unei colecții mari de fișiere poate fi puțin deranjantă, așa că vom folosi opțiunea –dry-run pentru a verifica că totul este în regulă înainte de a face pasul și de a ne angaja să facem modificările.

Opțiunea –dry-run îi spune patch-ului să facă totul în afară de modificarea efectivă a fișierelor. patch-ul va efectua toate verificările sale înainte de zbor asupra fișierelor și, dacă întâmpină probleme, le raportează. În orice caz, niciun fișier nu este modificat.

Dacă nu sunt raportate probleme, putem repeta comanda fără opțiunea –dry-run și putem corecta cu încredere fișierele noastre.

Opțiunea -d (director) spune patch-ului în ce director să lucreze.

Rețineți că nu folosim opțiunea -i (input) pentru a spune patch-ului care fișier de corecție conține instrucțiunile de la diff. În schimb, redirecționăm fișierul patch în patch with <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

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 

This time each line of output doesn’t start with “checking,” each line starts with “patching.”

And no problems are reported. We can compile our source code, and we’ll be on the latest version of the software.

Settle Your Differences

This is by far the easiest and safest way to use patch. Copy your target files to a folder and patch that folder. Copy them back when you’re happy that the patching process completed error free.