Hur man applicerar en patch på en fil (och skapar patchar) i Linux

Kommandot Linux patch låter dig överföra ändringarna från en uppsättning filer till en annan uppsättning filer snabbt och säkert. Lär dig hur du använder patch på det enkla sättet.

Kommandona patch och diff

Föreställ dig att du har en textfil på din dator. Du får en modifierad version av den textfilen från någon annan. Hur överför du snabbt alla ändringar från den ändrade filen till din ursprungliga fil? Det är där patch och diff spelar in. patch och diff finns i Linux och andra Unix-liknande operativsystem, som macOS.

Kommandot diff undersöker två olika versioner av en fil och listar skillnaderna mellan dem. Skillnaderna kan lagras i en fil som kallas en patch-fil.

Kommandot patch kan läsa en patchfil och använda innehållet som en uppsättning instruktioner. Genom att följa dessa instruktioner är ändringarna i den ändrade filen replikeras i originalet fil.

Föreställ dig nu att processen händer med en hel katalog med textfiler. Allt i ett svep. Det är kraften i patch.

Ibland får du inte de ändrade filerna skickade. Allt du får skickat är patchfilen. Varför skicka dussintals filer runt när du kan skicka en fil, eller lägga upp en fil för enkel nedladdning?

Vad gör du med patchfilen för att faktiskt patcha dina filer? Förutom att nästan vara en tungvridare är det också en bra fråga. Vi går igenom det i den här artikeln.

Kommandot patch används oftast av personer som arbetar med källkodsfiler för programvara, men det fungerar lika bra med vilken uppsättning textfiler som helst, oavsett syfte, källkod eller inte.

Vårt exempelscenario

I det här scenariot befinner vi oss i en katalog som heter work som innehåller två andra kataloger. Den ena heter att arbeta och den andra heter senaste. Arbetskatalogen innehåller en uppsättning källkodsfiler. Den senaste katalogen innehåller den senaste versionen av dessa källkodsfiler, av vilka några har modifierats.

För säkerhets skull är arbetskatalogen en kopia av den aktuella versionen av textfilerna. Det är inte den enda kopian av dem.

Hitta skillnaderna mellan två versioner av en fil

Kommandot diff hittar skillnaderna mellan två filer. Dess standardåtgärd är att lista de modifierade raderna i terminalfönstret.

En fil heter slang.c. Vi kommer att jämföra versionen i arbetskatalogen med den i den senaste katalogen.

Alternativet -u (unified) säger åt diff att även lista några av de omodifierade textraderna från före och efter var och en av de ändrade avsnitten. Dessa linjer kallas kontextlinjer. De hjälper patch-kommandot att hitta exakt var en ändring måste göras i originalfilen.

Vi tillhandahåller namnen på filerna så att diff vet vilka filer som ska jämföras. Den ursprungliga filen listas först, sedan den ändrade filen. Detta är kommandot vi utfärdar för att diff:

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

diff producerar en utdatalista som visar skillnaderna mellan filerna. Om filerna var identiska skulle det inte finnas någon utdata alls. Att se den här typen av utdata från diff bekräftar att det finns skillnader mellan de två filversionerna och att originalfilen behöver korrigeras.

Skapa en patchfil

För att fånga dessa skillnader i en patchfil, använd följande kommando. Det är samma kommando som ovan, med utdata från diff omdirigerad till en fil som heter slang.patch.

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

diff -u working/slang.c senaste/slang.c > slang.patch i ett terminalfönster” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Namnet på patchfilen är godtyckligt.  Du kan kalla det vad du vill.  Att ge det en ”.patch”-tillägg är en bra idé;  Men eftersom det gör det tydligt vilken typ av fil det är.</p>
<p>För att få patch att agera på patchfilen och modifiera working/slang.c-filen, använd följande kommando.  Alternativet -u (unified) låter patch veta att patchfilen innehåller enhetliga kontextrader.  Med andra ord använde vi alternativet -u med diff, så vi använder alternativet -u med patch.</p>
<p>patch -u working.slang.c -i slang.patch</p>
<p> <img loading=

Om allt går bra, finns det en enda rad med utdata som talar om för dig att patch patchar filen.

Göra en säkerhetskopia av originalfilen

Vi kan instruera patch att göra en säkerhetskopia av korrigerade filer innan de ändras genom att använda alternativet -b (säkerhetskopiering). Alternativet -i (ingång) talar om för patch namnet på patchfilen som ska användas:

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

Filen korrigeras som tidigare, utan någon synlig skillnad i utdata. Men om du tittar in i arbetsmappen ser du att filen slang.c.orig har skapats. Filernas datum- och tidsstämplar visar att slang.c.orig är originalfilen och slang.c är en ny fil skapad av patch.

Använda diff med kataloger

Vi kan använda diff för att skapa en patchfil som innehåller alla skillnader mellan filerna i två kataloger. Vi kan sedan använda den patchfilen med patch för att få dessa skillnader att tillämpas på filerna i arbetsmappen med ett enda kommando.

Alternativen vi kommer att använda med diff är alternativet -u (unified context) som vi har använt tidigare, alternativet -r (rekursivt) för att få diff att titta in i alla underkataloger och alternativet -N (ny fil).

Alternativet -N berättar för diff hur man hanterar filer i den senaste katalogen som inte finns i arbetskatalogen. Det tvingar diff att lägga instruktioner i patchfilen så att patch skapar filer som finns i den senaste katalogen men som saknas i arbetskatalogen.

Du kan sätta ihop alternativen så att de använder ett enda bindestreck (-).

Observera att vi bara tillhandahåller katalognamnen, vi säger inte åt diff att titta på specifika 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>
<h2 role=Kikar in i patchfilen

Låt oss ta en snabb titt i patchfilen. Vi kommer att använda mindre för att titta på innehållet.

Den övre delen av filen visar skillnaderna mellan de två versionerna av slang.c.

Scrollar vi längre ner genom patchfilen ser vi att den sedan beskriver ändringarna i en annan fil som heter structs.h. Detta verifierar att patchfilen definitivt innehåller skillnaderna mellan olika versioner av flera filer.

Titta innan du hoppar

Att patcha en stor samling filer kan vara lite irriterande, så vi kommer att använda alternativet –dry-run för att kontrollera att allt är bra innan vi tar steget och förbinder oss att göra ändringarna.

Alternativet –dry-run säger åt patch att göra allt förutom att faktiskt modifiera filerna. patch kommer att utföra alla sina kontroller före flygningen av filerna och om den stöter på några problem rapporterar den dem. Hur som helst, inga filer ändras.

Om inga problem rapporteras kan vi upprepa kommandot utan alternativet –dry-run och med förtroende korrigera våra filer.

Alternativet -d (katalog) talar om för patch vilken katalog som ska arbeta på.

Observera att vi inte använder alternativet -i (ingång) för att tala om för patch vilken patchfil som innehåller instruktionerna från diff. Istället omdirigerar vi patchfilen till 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.