Как да приложите корекция към файл (и да създадете пачове) в Linux

Командата Linux patch ви позволява да прехвърляте бързо и безопасно промените от един набор файлове в друг набор от файлове. Научете как да използвате кръпка по лесния начин.

Командите patch и diff

Представете си, че имате текстов файл на вашия компютър. Получавате променена версия на този текстов файл от някой друг. Как бързо да прехвърлите всички промени от модифицирания файл във вашия оригинален файл? Това е мястото, където patch и diff влизат в игра. patch и diff се намират в Linux и други подобни на Unix операционни системи, като macOS.

Командата diff проверява две различни версии на файл и изброява разликите между тях. Разликите могат да бъдат съхранени във файл, наречен пач файл.

Командата patch може да чете файл с корекция и да използва съдържанието като набор от инструкции. Следвайки тези инструкции, промените в модифицирания файл са репликиран в оригинал файл.

Сега си представете, че този процес се случва с цяла директория с текстови файлове. Всичко наведнъж. Това е силата на пластира.

Понякога не ви се изпращат променените файлове. Всичко, което получавате, е пач файла. Защо да изпращате десетки файлове, когато можете да изпратите един файл или да публикувате един файл за лесно изтегляне?

Какво правите с файла за корекция, за да коригирате вашите файлове? Освен че е почти говорене на езици, това е и добър въпрос. Ще ви преведем през това в тази статия.

Командата patch се използва най-често от хора, работещи с файлове с изходен код на софтуера, но работи еднакво добре с всеки набор от текстови файлове, независимо от предназначението им, изходен код или не.

Нашият примерен сценарий

В този сценарий се намираме в директория, наречена work, която съдържа две други директории. Единият се нарича работещ, а другият се нарича последен. Работната директория съдържа набор от файлове с изходен код. Най-новата директория съдържа най-новата версия на тези файлове с изходен код, някои от които са променени.

  Как лесно да изтегляте и инсталирате приложения на Linux с AppImage Pool

За да сме сигурни, работната директория е копие на текущата версия на текстовите файлове. Това не е единственото им копие.

Намиране на разликите между две версии на файл

Командата diff открива разликите между два файла. Неговото действие по подразбиране е да изброи променените редове в прозореца на терминала.

Един файл се нарича slang.c. Ще сравним версията в работната директория с тази в най-новата директория.

Опцията -u (унифицирана) казва на diff също да изброи някои от немодифицираните текстови редове преди и след всяка от променените секции. Тези линии се наричат ​​контекстни линии. Те помагат на командата patch да намери точно къде трябва да се направи промяна в оригиналния файл.

Ние предоставяме имената на файловете, така че diff да знае кои файлове да сравни. Първо се посочва оригиналният файл, след това модифицираният файл. Това е командата, която издаваме за diff:

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

diff създава изходен списък, показващ разликите между файловете. Ако файловете бяха идентични, изобщо нямаше да има изход. Виждането на този тип изход от diff потвърждава, че има разлики между двете версии на файла и че оригиналният файл се нуждае от корекция.

Създаване на файл за корекция

За да уловите тези разлики във файл с корекция, използвайте следната команда. Това е същата команда като по-горе, като изходът от diff се пренасочва във файл, наречен slang.patch.

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

diff -u work/slang.c last/slang.c > slang.patch в прозорец на терминала” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Името на файла с корекцията е произволно.  Можете да го наречете както искате.  Даването на разширение „.patch” е добра идея;  обаче, тъй като става ясно какъв тип файл е.</p>
<p>За да накарате patch да действа върху файла за корекция и да промените файла work/slang.c, използвайте следната команда.  Опцията -u (унифицирана) позволява на patch да знае, че файлът за корекция съдържа унифицирани контекстни линии.  С други думи, използвахме опцията -u с diff, така че използваме опцията -u с кръпка.</p>
<div style=

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

Ако всичко върви добре, има един-единствен изходен ред, който ви казва, че кръпката поправя файла.

Създаване на резервно копие на оригиналния файл

Можем да инструктираме patch да направи резервно копие на закърпените файлове, преди да бъдат променени, като използваме опцията -b (резервно копие). Опцията -i (вход) казва на корекцията името на файла за корекция, който да се използва:

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

Файлът е закърпен както преди, без видима разлика в изхода. Ако обаче погледнете в работната папка, ще видите, че е създаден файл, наречен slang.c.orig. Печатите за дата и час на файловете показват, че slang.c.orig е оригиналният файл, а slang.c е нов файл, създаден чрез корекция.

Използване на diff With Directories

Можем да използваме diff, за да създадем файл с корекция, който съдържа всички разлики между файловете в две директории. След това можем да използваме този файл с корекция с корекция, за да приложим тези разлики към файловете в работната папка с една команда.

Опциите, които ще използваме с diff, са опцията -u (унифициран контекст), която използвахме по-рано, опцията -r (рекурсивна), за да накараме diff да разглежда всякакви поддиректории и опцията -N (нов файл).

Опцията -N указва на diff как да обработва файлове в най-новата директория, които не са в работната директория. Той принуждава diff да постави инструкции във файла за корекция, така че patch да създава файлове, които присъстват в най-новата директория, но липсват в работната директория.

Можете да групирате опциите заедно, така че да използват едно тире (-).

Имайте предвид, че предоставяме само имената на директории, не казваме на diff да разглежда конкретни файлове:

diff -ruN working/ latest/ > slang.patch

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

Надникване във файла за корекция

Нека да разгледаме бързо файла за корекция. Ще използваме по-малко, за да разгледаме съдържанието му.

Горната част на файла показва разликите между двете версии на sleng.c.

Превъртайки по-надолу през файла за корекция, виждаме, че той описва промените в друг файл, наречен structs.h. Това потвърждава, че файлът за корекция определено съдържа разликите между различните версии на множество файлове.

Погледни преди да скочиш

Поправянето на голяма колекция от файлове може да бъде малко обезпокоително, така че ще използваме опцията –dry-run, за да проверим, че всичко е наред, преди да се решим и да се ангажираме да направим промените.

Опцията –dry-run казва на patch да прави всичко, освен действителната промяна на файловете. patch ще извърши всички свои проверки преди полета на файловете и ако срещне някакви проблеми, ще ги докладва. Така или иначе не се променят никакви файлове.

Ако не се съобщават проблеми, можем да повторим командата без опцията –dry-run и уверено да коригираме нашите файлове.

Опцията -d (директория) казва на корекцията в коя директория да работи.

Имайте предвид, че не използваме опцията -i (вход), за да кажем на корекцията кой файл за корекция съдържа инструкциите от diff. Вместо това, ние пренасочваме файла за корекция в patch with <. 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.