Patch (Unix)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 25. august 2021; verifikation kræver 1 redigering .

lappe
Type UNIX [d] værktøj
Udvikler Andreas Gruenbacher, Jim Meyering
Operativ system Cross-platform software
Første udgave 1985
nyeste version
Licens GPL
Internet side savannah.gnu.org/project…

patch er et Unix -  softwareværktøj designet til at overføre redigeringer (ændringer) mellem forskellige versioner af tekstfiler. Information om redigering er normalt indeholdt i en separat fil kaldet en "patch", "edit" eller "edit file" (" patch file" - engelsk patch file ). En sådan fil oprettes normalt ved hjælp af et andet Unix-værktøj, diff , som automatisk udtrækker information om forskelle i filernes tekst.  

Historie

Det originale patch-program blev skrevet af den fremtidige Perl -forfatter Larry Wall ( postet til mod.sources ). I dag er patch-programmet en del af GNU - projektet og vedligeholdes af FSF .

Brug

Mens den oprindelige hensigt med et program var at bygge bro over forskelle mellem versioner af programfiler (så en programmør, der lavede nyttige ændringer i sit program, kunne dele disse ændringer med andre programmører, der bruger tidligere versioner af koden), kan patch bruges til at bygge bro over forskelle mellem to tekstfiler, inklusive men ikke begrænset til programdokumentation, html-filer og så videre.

De "ændre filer" eller "patches" eller, uformelt, "patches", der bruges af patch-værktøjet ("patch-filer", "patches") er tekstfiler i et særligt format. I modsætning til dem er der også binære filer med et lignende formål, men sidstnævnte har som regel intet at gøre med patch-værktøjet og er forbundet med opgaverne med at foretage ændringer i binære (ikke-tekst-) filer, inklusive program eksekverbare filer.

Indhold af patch-filer

De filer, der er resultatet af forskelligt arbejde, har et bestemt format, som blandt andet er praktisk til at læse og lave redigeringer "manuelt" af brugeren selv.

Et eksempel på indholdet af en sådan fil:

--- 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. -8.5. @@ +#include <stdio.h> + int -main(void) +main(int argc, char** argv) { + printf("%s: Eksempel `diff` brug;\n", __FILE__); returnere 0; }

Linjen, der starter med et tredobbelt minustegn (i det enkleste tilfælde, den første linje) indeholder den relative sti til den originale fil og den sidste ændringstid. Så på den næste linje, efter det tredobbelte plustegnet, er den relative sti og sidste ændrede tidspunkt for den endelige version af filen, der blev brugt til at oprette patchen.

Yderligere, på linjen, der begynder og slutter med det dobbelte symbol "@" efter "minus"-tegnet, linjenummeret i begyndelsen af ​​det givne tekstafsnit og antallet af linjer , som dette afsnit optog i den gamle version af filen er angivet, og efter "plus"-tegnet, lignende karakteristika for afsnittet i den nye fil. Nedenfor er selve afsnittet, hvor der tilføjes et mellemrum i begyndelsen af ​​hver linje, hvis linjen ikke er ændret, "minus", hvis den ikke er i den nye fil, og følgelig "plus", hvis denne linje er tilføjet. I eksempelfilen ovenfor er der kun et sådant segment, men der kan være et hvilket som helst antal af dem. Derudover kan patchen indeholde information om ændringer foretaget i andre filer, hvis kommandoen diffblev anvendt på en mappe.

Meget ofte forekommer patching i forbindelse med at bruge en form for versionskontrolsystem . Hvis ændringsfilen blev oprettet ved hjælp af en af ​​dem, for eksempel git , så vil formatet ikke være fundamentalt anderledes, det kan blot indeholde yderligere information, der er redundant for værktøjet patch.

Eksempel på brug

For at oprette en patch eller redigere fil ved hjælp af diff-værktøjet, kør:

$ diff -u old_file new_file > diff.diff # -u switchen fortæller diff at udskrive forskellen i det, der kaldes "standard" ("unified") format

For at anvende den resulterende patch skal du køre følgende kommando:

$ patch < difference.diff

Hvis du kører den sidste kommando, overføres forskellen fra den nye fil til den gamle, og den gamle fil opdateres. (Hvis den gamle fil ikke findes i den givne sti, vil programmet give en fejl.)

Patchen kan "rulles tilbage", det vil sige annulleres, ved at overføre -R-kontakten til patch-programmet:

$ patch -R < difference.diff

Som regel er patch-værktøjet i stand til at opdatere filen korrekt, selvom den har ændret sig en del (f.eks. er den blevet redigeret i et område, der ikke overlapper med omfanget af den aktuelle patch).

For at gøre dette bruger programrettelsesværktøjet en "kontekst" - et par linjer ved siden af ​​programrettelsens omfang, gemt i redigeringsfilen sammen med anden information om erstatningen.

Men i tilfælde af en betydelig uoverensstemmelse mellem den fil, som patchen er påført ("applied") og den kildefil, der blev brugt til at oprette patchen, er korrektheden af ​​at anvende patchen generelt set ikke garanteret.

Portering (portering til andre platforme)

Oprettet til brug på Unix-systemer, er patch-værktøjet siden blevet overført til Windows -platformen og flere andre. Windows patch-versioner kan findes i GnuWin32- og UnxUtils -pakkerne såvel som i Cygwin- miljøet .

Se også

  • Dyne
  • rsync
  • IEBUPDTE er en analog af patchprogrammet, der blev oprettet omkring 20 år tidligere (formodentlig i 1964 til System 360 mainframes ).

Noter

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

Links

  • patch(1): anvender en diff-fil til originalen - GNU / Linux brugerdefinerede kommandoer man -side  
  • Patchutils  - Yderligere programmer til at arbejde med patches
  • GNU-værktøjer til Win32  - Win32-port af GNU-værktøjer, inklusive diff og patch
  • diffstat  - udsender statistik baseret på output fra diff-værktøjet