Linux komanda za zakrpe omogućava brz i siguran prenos izmena iz jednog skupa datoteka u drugi. Upoznajte se sa načinom korišćenja zakrpa na jednostavan način.
Komande patch i diff
Zamislite situaciju da imate tekstualni fajl na svom računaru. Dobijate izmenjenu verziju istog fajla od druge osobe. Kako brzo preneti sve promene iz modifikovanog fajla u originalni? Tu na scenu stupaju komande patch
i diff
. Ove komande su prisutne u Linux-u i drugim operativnim sistemima baziranim na Unix-u, poput macOS-a.
Komanda diff
analizira dve različite verzije fajla i izdvaja razlike između njih. Ove razlike se mogu sačuvati u posebnom fajlu koji se naziva „patch“ fajl.
Komanda patch
može pročitati „patch“ fajl i primeniti njegov sadržaj kao niz instrukcija. Prateći ove instrukcije, izmene iz modifikovane datoteke se reprodukuje u originalnom fajlu.
Sada zamislite da se ovaj proces odvija nad celim direktorijumom tekstualnih fajlova. Sve odjednom. To je snaga zakrpa.
Ponekad ne dobijate izmenjene fajlove. Sve što dobijete je „patch“ fajl. Zašto slati na desetine fajlova, kada možete poslati jedan fajl ili ga postaviti za jednostavno preuzimanje?
Šta radite sa „patch“ fajlom da biste zaista zakrpili svoje fajlove? Osim što je to praktično, to je i dobro pitanje. Detaljno ćemo to razjasniti u ovom tekstu.
Komandu patch
najčešće koriste ljudi koji rade sa izvornim kodom softvera, ali ona podjednako dobro radi sa bilo kojim skupom tekstualnih fajlova, bez obzira na njihovu namenu, izvorni kod ili ne.
Naš primer scenarija
U ovom scenariju, nalazimo se u direktorijumu koji se zove „rad“, koji sadrži još dva poddirektorijuma. Jedan se zove „radni“, a drugi „najnoviji“. „Radni“ direktorijum sadrži skup fajlova izvornog koda. „Najnoviji“ direktorijum sadrži najnoviju verziju tih fajlova, od kojih su neki izmenjeni.
Radi sigurnosti, „radni“ direktorijum je kopija trenutne verzije tekstualnih fajlova. To nije njihova jedina kopija.
Pronalaženje razlika između dve verzije fajla
Komanda diff
pronalazi razlike između dva fajla. Njena osnovna funkcija je da prikaže izmenjene linije u terminalu.
Jedan od fajlova se zove „slang.c“. Uporedićemo verziju u „radnom“ direktorijumu sa onom u „najnovijem“ direktorijumu.
Opcija -u
(unified) nalaže komandi diff
da prikaže i neke neizmenjene linije teksta pre i posle svakog od promenjenih delova. Ove linije se nazivaju kontekstne linije. One pomažu komandi patch
da precizno odredi gde treba izvršiti izmenu u originalnom fajlu.
Navodimo imena fajlova tako da diff
zna koje fajlove treba uporediti. Prvo se navodi originalni fajl, a zatim izmenjeni. Ovo je komanda koju izvršavamo za diff
:
diff -u working/slang.c latest/slang.c
diff
generiše izlaznu listu koja prikazuje razlike između fajlova. Da su fajlovi identični, izlaz uopšte ne bi bio prikazan. Videti ovakav izlaz od diff
-a potvrđuje da postoje razlike između dve verzije fajla i da je potrebno zakrpiti originalni fajl.
Kreiranje „patch“ fajla
Da biste sačuvali te razlike u „patch“ fajl, koristite sledeću komandu. To je ista komanda kao gore, sa izlazom od diff
-a preusmerenim u fajl pod nazivom „slang.patch“.
diff -u working/slang.c latest/slang.c > slang.patch
Naziv „patch“ fajla je proizvoljan. Možete ga nazvati kako god želite. Dodavanje ekstenzije „.patch“ je dobra ideja, jer jasno pokazuje o kojoj vrsti fajla se radi.
Da bi komanda patch
primenila „patch“ fajl i izmenila „working/slang.c“ fajl, koristite sledeću komandu. Opcija -u
(unified) daje do znanja komandi patch
da „patch“ fajl sadrži objedinjene kontekstne linije. Drugim rečima, pošto smo koristili opciju -u
sa diff
, koristimo opciju -u
i sa komandom patch
.
patch -u working/slang.c -i slang.patch
Ako sve prođe kako treba, postoji jedan red izlaza koji govori da patch
zakrpi fajl.
Pravljenje rezervne kopije originalnog fajla
Možemo naložiti komandi patch
da napravi rezervnu kopiju zakrpljenih fajlova pre nego što se promene primene, korišćenjem opcije -b
(backup). Opcija -i
(input) govori komandi patch
ime „patch“ fajla koji treba koristiti:
patch -u -b working/slang.c -i slang.patch
Fajl je zakrpljen kao i ranije, bez vidljive razlike u izlazu. Međutim, ako pogledate u „radni“ direktorijum, videćete da je kreiran fajl pod nazivom „slang.c.orig“. Oznake datuma i vremena fajlova pokazuju da je „slang.c.orig“ originalni fajl, a „slang.c“ novi fajl kreiran komandom patch
.
Korišćenje diff sa direktorijumima
Možemo koristiti diff
da kreiramo „patch“ fajl koji sadrži sve razlike između fajlova u dva direktorijuma. Zatim možemo koristiti taj „patch“ fajl sa komandom patch
da bismo te razlike primenili na fajlove u „radnom“ direktorijumu pomoću jedne komande.
Opcije koje ćemo koristiti sa komandom diff
su -u
(objedinjeni kontekst) koju smo ranije koristili, -r
(rekurzivno) opcija da diff
pregleda sve poddirektorijume i opcija -N
(nova datoteka).
Opcija -N
govori komandi diff
kako da postupa sa fajlovima u „najnovijem“ direktorijumu koji ne postoje u „radnom“ direktorijumu. Ona primorava diff
da stavi instrukcije u „patch“ fajl tako da patch
kreira fajlove koji su prisutni u „najnovijem“ direktorijumu, ali nedostaju u „radnom“ direktorijumu.
Možete grupisati opcije tako da koriste jednu crticu (-
).
Imajte na umu da navodimo samo imena direktorijuma, ne govorimo komandi diff
da pregleda određene fajlove:
diff -ruN working/ latest/ > slang.patch
Zavirivanje u „patch“ fajl
Hajde da brzo pogledamo „patch“ fajl. Koristićemo komandu less
da pregledamo njegov sadržaj.
Vrh fajla pokazuje razlike između dve verzije fajla „slang.c“.
Krećući se dalje kroz „patch“ fajl, vidimo da on zatim opisuje promene u drugom fajlu koji se zove „structs.h“. Ovo potvrđuje da „patch“ fajl definitivno sadrži razlike između različitih verzija više fajlova.
Provera pre primene
Zakrpljivanje velike kolekcije fajlova može biti pomalo zastrašujuće, pa ćemo koristiti opciju --dry-run
da proverimo da li je sve u redu pre nego što se posvetimo promenama.
Opcija --dry-run
govori komandi patch
da uradi sve osim stvarne izmene fajlova. patch
će izvršiti sve provere pre primene zakrpa i, ukoliko naiđe na bilo kakve probleme, prijavljuje ih. U svakom slučaju, nijedan fajl se ne menja.
Ako nema prijavljenih problema, možemo ponoviti komandu bez opcije --dry-run
i pouzdano zakrpiti naše fajlove.
Opcija -d
(directory) govori komandi patch
u kom direktorijumu treba da radi.
Imajte na umu da ne koristimo opciju -i
(input) da bismo rekli komandi patch
koji „patch“ fajl sadrži instrukcije od diff
-a. Umesto toga, preusmeravamo „patch“ fajl u komandu patch
sa <.
patch --dry-run -ruN -d working < slang.patch
Od celog direktorijuma, diff
je pronašao dva fajla za zakrpljivanje. Instrukcije o modifikacijama za ta dva fajla su proverene od strane patch
i nisu prijavljeni problemi.
Provere pre primene su u redu; spremni smo za akciju.
Zakrpljivanje direktorijuma
Da bismo zaista primenili zakrpe na fajlove, koristimo prethodnu komandu bez opcije --dry-run
.
patch -ruN -d working < slang.patch
Ovog puta svaka linija izlaza ne počinje sa „checking“, već sa „patching“.
I nisu prijavljeni problemi. Možemo kompajlirati naš izvorni kod i bićemo na najnovijoj verziji softvera.
Rešite vaše razlike
Ovo je daleko najlakši i najsigurniji način korišćenja komande patch
. Kopirajte vaše ciljne fajlove u folder i zakrpite taj folder. Kopirajte ih nazad kada ste zadovoljni da je proces zakrpljivanja završen bez grešaka.