Patch (Unix)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 25 august 2021; verificarea necesită 1 editare .

plasture
Tip de Utilitarul UNIX [d].
Dezvoltator Andreas Gruenbacher, Jim Meyering
Sistem de operare Software multiplatformă
Prima editie 1985
ultima versiune
Licență GPL
Site-ul web savannah.gnu.org/project…

patch este un utilitar  software Unix conceput pentru a transfera editări (modificări) între diferite versiuni de fișiere text. Informațiile despre editare sunt de obicei conținute într-un fișier separat numit „patch”, „edit” sau „edit file” („ fișier de corecție ” - fișier de corecție în engleză  ). Un astfel de fișier este de obicei creat folosind un alt utilitar Unix, diff , care extrage automat informații despre diferențele în textul fișierelor.

Istorie

Programul original de patch a fost scris de viitorul autor Perl Larry Wall ( postat pe mod.sources ) . Astăzi, programul de corecție face parte din Proiectul GNU și este întreținut de FSF .

Utilizare

În timp ce intenția inițială a unui program a fost de a compensa diferențele dintre versiunile fișierelor de program (astfel încât un programator care a făcut modificări utile programului său să poată partaja acele modificări cu alți programatori folosind versiuni anterioare ale codului), patch-ul poate fi folosit pentru a compensa diferențele. între oricare două fișiere text, inclusiv, dar fără a se limita la documentația programului, fișierele html și așa mai departe.

„Fișierele de modificare” sau „patch-urile” sau, în mod informal, „patch-urile” utilizate de utilitarul de corecție („fișiere de corecție”, „patch-uri”) sunt fișiere text într-un format special. Spre deosebire de acestea, există și fișiere binare cu un scop similar, cu toate acestea, acestea din urmă, de regulă, nu au nimic de-a face cu utilitarul de corecție și sunt asociate cu sarcinile de a face modificări la fișierele binare (non-text), inclusiv programul. fișiere executabile.

Conținutul fișierelor de corecție

Fișierele care sunt rezultatul lucrului diferit au un anumit format, care este convenabil, printre altele, pentru citirea și editarea „manual” de către utilizator însuși.

Un exemplu de conținut al unui astfel de fișier:

--- a/path/to/file 2021-01-26 22:55:55.288371691 +0300 +++ b/path/to/file 2021-01-26 22:58:31.790414616 +0300 @@ -1.5 +1 . @@ +#include <stdio.h> + int -main(void) +main(int argc, char** argv) { + printf("%s: Exemplu de utilizare `dif`;\n", __FILE__); întoarce 0; }

Linia care începe cu un semn triplu minus (în cel mai simplu caz, prima linie) conține calea relativă la fișierul original și ora ultimei modificări. Apoi, pe linia următoare, după semnul triplu plus, se află calea relativă și ora ultimei modificări a versiunii finale a fișierului folosit pentru a crea patch-ul.

În plus, pe linia care începe și se termină cu simbolul dublu „@” după semnul „minus”, numărul liniei de la începutul secțiunii date de text și numărul de linii pe care această secțiune le-a ocupat în versiunea veche a fișierului sunt indicate, iar după semnul „plus”, caracteristici asemănătoare secțiunii din noul dosar. Mai jos este secțiunea în sine, unde se adaugă un spațiu la începutul fiecărei linii dacă linia nu s-a schimbat, „minus” dacă nu se află în noul fișier și, în consecință, „plus” dacă această linie a fost adăugată. În fișierul exemplu de mai sus, există un singur astfel de segment, dar poate exista orice număr de ele. În plus, patch-ul poate conține informații despre modificările aduse altor fișiere dacă comanda diffa fost aplicată unui director.

Foarte des, corecția apare în contextul utilizării unui tip de sistem de control al versiunilor . Dacă fișierul de modificare a fost creat folosind unul dintre ele, de exemplu git , atunci formatul nu va fi fundamental diferit, poate conține pur și simplu informații suplimentare care sunt redundante pentru utilitar patch.

Exemplu de utilizare

Pentru a crea un patch sau a edita un fișier, folosind utilitarul diff, rulați:

$ diff -u fișier_vechi fișier_nou > diff.diff # Comutatorul -u îi spune lui diff să imprime diferența în ceea ce se numește format „standard” („unificat”)

Pentru a aplica patch-ul rezultat, executați următoarea comandă:

$ patch < difference.diff

Rularea ultimei comenzi va transfera diferența de la noul fișier în cel vechi, actualizând fișierul vechi. (Dacă fișierul vechi nu este găsit în calea dată, programul va arunca o eroare.)

Patch-ul poate fi „rulat înapoi”, adică anulat, trecând comutatorul -R la programul de corecție:

$ patch -R <diferență.dif

De regulă, utilitarul de corecție este capabil să actualizeze corect fișierul chiar dacă acesta s-a schimbat oarecum (de exemplu, a fost editat într-o zonă care nu se suprapune cu domeniul de aplicare al corecțiilor curente).

Pentru a face acest lucru, utilitarul de corecție folosește un „context” - câteva linii adiacente domeniului de aplicare a patch-ului, stocate în fișierul de editare împreună cu alte informații despre înlocuire.

Totuși, în cazul unei discrepanțe semnificative între fișierul căruia i se aplică patch-ul („aplicat”) și fișierul sursă utilizat pentru a crea patch-ul, corectitudinea aplicării patch-ului, în general, nu este garantată.

Portare (portare pe alte platforme)

Creat pentru a fi utilizat pe sistemele Unix, utilitarul de corecție a fost de atunci portat pe platforma Windows și pe alte câteva. Versiunile de corecție Windows pot fi găsite în pachetele GnuWin32 și UnxUtils , precum și în mediul Cygwin .

Vezi și

  • Pilota
  • rsync
  • IEBUPDTE este un analog al programului de corecție, creat cu aproximativ 20 de ani mai devreme (probabil în 1964 pentru sistemele mainframe System 360 ).

Note

  1. https://git.savannah.gnu.org/cgit/patch.git/tag/?h=v2.7.6

Link -uri

  • patch(1): aplicarea unui fișier diff la pagina de manual cu comenzi personalizate GNU / Linux originală  
  • Patchutils  - Programe suplimentare pentru lucrul cu patch-uri
  • Instrumente GNU pentru Win32  - portul Win32 al utilitarelor GNU, inclusiv diff și patch
  • diffstat  - emiterea de statistici bazate pe rezultatul utilitarului diff