Linux-kommandoen patch
gir deg en effektiv og sikker måte å overføre endringer fra én filgruppe til en annen. La oss utforske hvordan du enkelt kan bruke patch
.
Forstå kommandoene patch
og diff
Se for deg at du har en tekstfil på datamaskinen din. Du mottar en
oppdatert versjon av denne filen fra en annen person. Hvordan kan du raskt
overføre alle modifikasjonene fra den endrede filen til den originale? Det er
her patch
og diff
kommer inn. Disse kommandoene er
tilgjengelige i Linux og andre Unix-baserte systemer, som macOS.
diff
-kommandoen analyserer
to ulike versjoner av en fil
og identifiserer forskjellene. Disse forskjellene kan lagres i en
patch
-fil.
patch
-kommandoen leser patch
-filen og tolker
innholdet som en rekke instruksjoner. Ved å følge disse instruksjonene blir
endringene fra den modifiserte filen
implementert i den originale filen.
Tenk deg nå at denne prosessen skjer med en hel mappe full av tekstfiler, alt
på en gang. Dette er kraften i patch
.
Noen ganger mottar du ikke de endrede filene, men kun en
patch
-fil. Hvorfor sende mange filer når man kan sende én enkelt
fil eller legge ut én fil for enkel nedlasting?
Hvordan bruker du denne patch
-filen til å oppdatere filene
dine? Dette skal vi gå gjennom i denne artikkelen.
Selv om patch
ofte brukes av programvareutviklere, kan den
brukes med hvilke som helst tekstfiler, uansett formål.
Vårt eksempel
I dette eksemplet jobber vi i en mappe kalt «work», som inneholder to
undermapper: «working» og «latest». «working»-mappen inneholder et sett med
kildekodefiler, mens «latest»-mappen inneholder de nyeste versjonene av disse
filene, hvorav noen er endret.
For ordens skyld er «working»-mappen en kopi av gjeldende versjon av
tekstfilene. Det er ikke den eneste kopien.
Identifisere forskjeller mellom filversjoner
diff
-kommandoen identifiserer forskjellene mellom to filer.
Standardfunksjonen er å vise de modifiserte linjene i terminalen.
Vi har en fil som heter «slang.c». Vi sammenligner versjonen i
«working»-mappen med den i «latest»-mappen.
Med alternativet «-u» (unified), instruerer vi diff
til å vise
noen av de uendrede linjene før og etter de endrede seksjonene. Disse
linjene, kalt kontekstlinjer, hjelper patch
med å finne nøyaktig
hvor endringene skal gjøres i originalfilen.
Vi oppgir filnavnene slik at diff
vet hvilke filer som skal
sammenlignes. Originalfilen kommer først, etterfulgt av den endrede filen.
Her er kommandoen vi bruker:
diff -u working/slang.c latest/slang.c
diff
genererer en utdataliste som viser forskjellene mellom
filene. Hvis filene var identiske, ville det ikke vært noen utdata. Å se
denne utdataen bekrefter at det er forskjeller mellom filversjonene, og at
originalfilen må oppdateres.
Opprette en patch-fil
For å lagre disse forskjellene i en patch
-fil, bruker vi
følgende kommando. Det er den samme kommandoen som tidligere, men vi omdirigerer
utdataen til en fil som heter «slang.patch».
diff -u working/slang.c latest/slang.c > slang.patch
Navnet på patch
-filen er valgfritt. Du kan gi den et hvilket som
helst navn. Det er imidlertid lurt å gi den filendelsen «.patch» slik at det
er tydelig hva slags fil det er.
For å få patch
til å bruke patch
-filen og endre
«working/slang.c»-filen, bruker vi denne kommandoen. Alternativet «-u»
informerer patch
om at patch
-filen inneholder
enhetlige kontekstlinjer. Med andre ord, siden vi brukte «-u»-alternativet med
diff
, må vi også bruke «-u»-alternativet med
patch
.
patch -u working/slang.c -i slang.patch
Hvis alt går som det skal, vil du se en linje med utdata som bekrefter at
patch
oppdaterer filen.
Sikkerhetskopiere originalfilen
Vi kan instruere patch
til å lage en sikkerhetskopi av filene
før de endres, ved å bruke «-b» (backup)-alternativet. Alternativet «-i»
(input) gir patch
navnet på patch
-filen som skal
brukes:
patch -u -b working/slang.c -i slang.patch
Filen blir oppdatert som før, uten noen synlig forskjell i utdataen. Men
hvis du ser inni «working»-mappen, ser du at filen «slang.c.orig» er
opprettet. Dato- og tidsstemplene til filene viser at «slang.c.orig» er den
originale filen, mens «slang.c» er en ny fil opprettet av
patch
.
Bruke diff med kataloger
Vi kan bruke diff
til å lage en patch
-fil som
inneholder alle forskjellene mellom filene i to kataloger. Denne
patch
-filen kan deretter brukes med patch
for å
implementere disse forskjellene i filene i «working»-mappen, med en enkelt
kommando.
Alternativene vi skal bruke med diff
er «-u» (enhetlig
kontekst), «-r» (rekursiv) for å få diff
til å se inn i alle
undermapper, og «-N» (ny fil).
«-N»-alternativet forteller diff
hvordan den skal håndtere filer
i «latest»-mappen som ikke finnes i «working»-mappen. Den tvinger
diff
til å inkludere instruksjoner i patch
-filen,
slik at patch
oppretter filer som finnes i «latest»-mappen, men
som mangler i «working»-mappen.
Du kan kombinere alternativene slik at de bruker en enkelt bindestrek (-).
Merk at vi kun oppgir katalognavnene; vi ber ikke diff
om å se
på spesifikke filer:
diff -ruN working/ latest/ > slang.patch
Se inn i patch-filen
La oss ta en rask titt på patch
-filen. Vi bruker less
for å se på innholdet.
Øverst i filen ser vi forskjellene mellom de to versjonene av «slang.c».
Når vi skroller lenger ned i patch
-filen, ser vi at den
beskriver endringene i en annen fil som heter «structs.h». Dette bekrefter
at patch
-filen inneholder forskjellene mellom ulike versjoner
av flere filer.
Se før du hopper
Å oppdatere en stor samling med filer kan være litt skremmende, så vi bruker
alternativet «–dry-run» for å sjekke at alt er i orden før vi faktisk
utfører endringene.
Alternativet «–dry-run» instruerer patch
til å gjøre alt,
bortsett fra å endre filene. patch
utfører alle sine
forhåndskontroller, og rapporterer eventuelle problemer. Ingen filer vil
bli endret.
Hvis ingen problemer rapporteres, kan vi gjenta kommandoen uten
«–dry-run»-alternativet og trygt oppdatere filene våre.
Alternativet «-d» (directory) forteller patch
hvilken katalog
den skal jobbe med.
Vi bruker ikke alternativet «-i» (input) for å fortelle patch
hvilken patch
-fil som inneholder instruksjonene fra
diff
. I stedet omdirigerer vi
patch
-filen til patch
ved hjelp av <
.
patch --dry-run -ruN -d working < slang.patch
Av hele katalogen fant diff
to filer å oppdatere. Instruksjonene
for endringene i disse to filene er kontrollert av patch
, og
ingen problemer er rapportert.
Forhåndskontrollene er OK; vi er klare til å ta av.
Oppdatere en katalog
For å faktisk oppdatere filene, bruker vi den forrige kommandoen uten
alternativet «–dry-run».
patch -ruN -d working < slang.patch
Denne gangen starter hver utdatalinje med «patching», ikke «checking».
Og ingen problemer er rapportert. Vi kan kompilere kildekoden vår, og vi vil være på den nyeste versjonen av programvaren.
Løs dine forskjeller
Dette er den enkleste og tryggeste måten å bruke patch
på. Kopier
målfilene dine til en mappe og oppdater den mappen. Kopier filene tilbake når
du er sikker på at oppdateringsprosessen er fullført uten feil.