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.
Indholdsfortegnelse
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.
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
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