Hvordan man anvender en patch til en fil (og opretter patches) i Linux

Linux patch-kommandoen lader dig overføre ændringerne fra et sæt filer til et andet sæt filer hurtigt og sikkert. Lær, hvordan du bruger patch på den enkle måde.

Kommandoerne patch og diff

Forestil dig, at du har en tekstfil på din computer. Du modtager en ændret version af den tekstfil fra en anden. Hvordan overfører du hurtigt alle ændringerne fra den ændrede fil til din originale fil? Det er her patch og diff spiller ind. patch og diff findes i Linux og andre Unix-lignende operativsystemer, såsom macOS.

Diff-kommandoen undersøger to forskellige versioner af en fil og opregner forskellene mellem dem. Forskellene kan gemmes i en fil kaldet en patch-fil.

Patch-kommandoen kan læse en patch-fil og bruge indholdet som et sæt instruktioner. Ved at følge disse instruktioner er ændringerne i den ændrede fil gentaget i originalen fil.

Forestil dig nu, at den proces sker med en hel mappe med tekstfiler. Alt på én gang. Det er kraften ved patch.

Nogle gange får du ikke tilsendt de ændrede filer. Det eneste du får tilsendt er patch-filen. Hvorfor sende snesevis af filer rundt, når du kan sende en fil, eller sende en fil til nem download?

Hvad gør du med patch-filen for rent faktisk at patch dine filer? Udover nærmest at være en tongue-twister, så er det også et godt spørgsmål. Vi guider dig igennem det i denne artikel.

Patch-kommandoen bruges oftest af folk, der arbejder med softwarekildekodefiler, men den fungerer lige så godt med ethvert sæt tekstfiler, uanset deres formål, kildekode eller ej.

Vores eksempelscenarie

I dette scenarie er vi i en mappe kaldet work, som indeholder to andre mapper. Den ene hedder arbejde, og den anden hedder nyeste. Arbejdsmappen indeholder et sæt kildekodefiler. Den seneste mappe indeholder den seneste version af disse kildekodefiler, hvoraf nogle er blevet ændret.

  Sådan opsætter du RStudio IDE på Linux

For en sikkerheds skyld er arbejdsmappen en kopi af den aktuelle version af tekstfilerne. Det er ikke den eneste kopi af dem.

Sådan finder du forskellene mellem to versioner af en fil

Kommandoen diff finder forskellene mellem to filer. Dens standardhandling er at liste de ændrede linjer i terminalvinduet.

En fil hedder slang.c. Vi sammenligner versionen i arbejdsbiblioteket med versionen i den seneste mappe.

Valgmuligheden -u (forenet) fortæller diff også at liste nogle af de uændrede tekstlinjer fra før og efter hver af de ændrede sektioner. Disse linjer kaldes kontekstlinjer. De hjælper patch-kommandoen med at finde præcist, hvor en ændring skal foretages i den originale fil.

Vi giver navnene på filerne, så diff ved, hvilke filer der skal sammenlignes. Den originale fil vises først, derefter den ændrede fil. Dette er den kommando, vi udsender til diff:

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

diff producerer en outputliste, der viser forskellene mellem filerne. Hvis filerne var identiske, ville der slet ikke være noget output på listen. At se denne type output fra diff bekræfter, at der er forskelle mellem de to filversioner, og at den originale fil skal lappes.

Oprettelse af en patch-fil

For at fange disse forskelle i en patch-fil, brug følgende kommando. Det er den samme kommando som ovenfor, med output fra diff omdirigeret til en fil kaldet slang.patch.

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

diff -u working/slang.c nyeste/slang.c > slang.patch i et terminalvindue” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Navnet på patch-filen er vilkårligt.  Du kan kalde det hvad du vil.  Det er en god idé at give den en “.patch”-udvidelse;  men det gør det klart, hvilken type fil det er.</p>
<p>For at få patch til at handle på patch-filen og ændre working/slang.c-filen, skal du bruge følgende kommando.  Indstillingen -u (forenet) lader patch vide, at patchfilen indeholder forenede kontekstlinjer.  Med andre ord brugte vi muligheden -u med diff, så vi bruger muligheden -u med patch.</p>
<div style=

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

Hvis alt går godt, er der en enkelt outputlinje, der fortæller dig, at patch patcher filen.

Lav en sikkerhedskopi af den originale fil

Vi kan instruere patch til at lave en sikkerhedskopi af patchede filer, før de ændres, ved at bruge -b (backup) muligheden. Indstillingen -i (input) fortæller patch navnet på patch-filen, der skal bruges:

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

Filen er patchet som før, uden nogen synlig forskel i outputtet. Men hvis du ser ind i arbejdsmappen, vil du se, at den fil kaldet slang.c.orig er blevet oprettet. Dato- og tidsstemplerne for filerne viser, at slang.c.orig er den originale fil, og slang.c er en ny fil oprettet af patch.

Brug af diff med mapper

Vi kan bruge diff til at oprette en patch-fil, der indeholder alle forskellene mellem filerne i to mapper. Vi kan derefter bruge den patch-fil med patch til at få disse forskelle anvendt på filerne i arbejdsmappen med en enkelt kommando.

De muligheder, vi vil bruge med diff, er -u (forenet kontekst) mulighed, vi har brugt tidligere, -r (rekursiv) mulighed for at få diff til at kigge i alle undermapper og -N (ny fil) mulighed.

Indstillingen -N fortæller diff, hvordan man håndterer filer i den seneste mappe, der ikke er i arbejdsmappen. Det tvinger diff til at lægge instruktioner i patch-filen, så at patch opretter filer, der er til stede i den seneste mappe, men mangler fra arbejdsmappen.

Du kan samle mulighederne, så de bruger en enkelt bindestreg (-).

Bemærk, at vi kun leverer mappenavnene, vi fortæller ikke diff at se på specifikke filer:

diff -ruN working/ latest/ > slang.patch

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

Kigger inde i patchfilen

Lad os tage et hurtigt kig på patch-filen. Vi bruger mindre på at se på indholdet.

Toppen af ​​filen viser forskellene mellem de to versioner af slang.c.

Scroller vi længere ned gennem patch-filen, ser vi, at den så beskriver ændringerne i en anden fil kaldet structs.h. Dette bekræfter, at patch-filen absolut indeholder forskellene mellem forskellige versioner af flere filer.

Se før du springer

At patche en stor samling af filer kan være lidt nervepirrende, så vi vil bruge –dry-run-indstillingen til at kontrollere, at alt er i orden, før vi tager springet og forpligter os til at foretage ændringerne.

Indstillingen –dry-run fortæller patch at gøre alt bortset fra faktisk at ændre filerne. patch vil udføre alle sine pre-flight checks på filerne, og hvis den støder på problemer, rapporterer den dem. Uanset hvad, bliver ingen filer ændret.

Hvis der ikke rapporteres problemer, kan vi gentage kommandoen uden indstillingen –dry-run og trygt patch vores filer.

Valgmuligheden -d (katalog) fortæller patch, hvilken mappe der skal arbejdes på.

Bemærk, at vi ikke bruger muligheden -i (input) til at fortælle patch, hvilken patch-fil, der indeholder instruktionerne fra diff. I stedet omdirigerer vi patchfilen til patch med <. 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.