Поиск по сайту:

Как применить патч к файлу (и создать патчи) в Linux


Команда Linux patch позволяет быстро и безопасно перенести изменения из одного набора файлов в другой набор файлов. Узнайте, как использовать patch простым способом.

Команды patch и diff

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

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

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

Теперь представьте, что этот процесс происходит с целым каталогом текстовых файлов. Все за один раз. В этом сила patch.

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

Что вы делаете с файлом исправления, чтобы действительно исправить ваши файлы? Помимо того, что это почти скороговорка, это еще и хороший вопрос. Мы расскажем вам об этом в этой статье.

Команда patch чаще всего используется людьми, работающими с файлами исходного кода программного обеспечения, но она одинаково хорошо работает с любым набором текстовых файлов, независимо от их назначения, независимо от того, исходный код или нет.

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

В этом сценарии мы находимся в каталоге work, который содержит два других каталога. Один называется рабочий, а другой называется последний. Рабочий каталог содержит набор файлов исходного кода. Последний каталог содержит самую последнюю версию этих файлов исходного кода, некоторые из которых были изменены.

На всякий случай рабочий каталог является копией текущей версии текстовых файлов. Это не единственная их копия.

Поиск различий между двумя версиями файла

Команда 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

Имя файла патча произвольное. Вы можете называть это как угодно. Дать ему расширение «.patch» — хорошая идея; однако, поскольку это дает понять, какой это тип файла.

Чтобы заставить patch воздействовать на файл исправления и изменить файл work/slang.c, используйте следующую команду. Параметр -u (унифицированный) позволяет patch узнать, что файл исправления содержит унифицированные контекстные строки. Другими словами, мы использовали параметр -u с diff, поэтому мы используем параметр -u с patch.

патч -u рабочий/сленг.c -i сленг.патч

Если все пойдет хорошо, будет одна строка вывода, говорящая вам, что patch исправляет файл.

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

Мы можем указать patch сделать резервную копию исправленных файлов перед их изменением, используя параметр -b (резервная копия). Параметр -i (ввод) указывает patch имя используемого файла исправления:

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

Файл исправлен, как и раньше, без видимой разницы в выводе. Однако, если вы заглянете в рабочую папку, вы увидите, что файл с именем slang.c.orig был создан. Отметки даты и времени файлов показывают, что slang.c.orig — это исходный файл, а slang.c — это новый файл, созданный с помощью patch.

Использование diff с каталогами

Мы можем использовать diff для создания файла исправления, содержащего все различия между файлами в двух каталогах. Затем мы можем использовать этот файл исправления с помощью patch, чтобы применить эти различия к файлам в рабочей папке с помощью одной команды.

Параметры, которые мы собираемся использовать с diff, — это параметр -u (унифицированный контекст), который мы использовали ранее, и параметр -r (рекурсивный ), чтобы заставить diff просматривать любые подкаталоги, и параметр -N (новый файл).

Параметр -N сообщает diff, как обрабатывать файлы в последнем каталоге, которые не находятся в рабочем каталоге. Это заставляет diff поместить инструкции в файл исправления, чтобы patch создавал файлы, которые присутствуют в последнем каталоге, но отсутствуют в рабочем каталоге.

Вы можете сгруппировать параметры вместе, чтобы они использовали один дефис (-).

Обратите внимание, что мы предоставляем только имена каталогов, мы не говорим diff просматривать определенные файлы:

diff -ruN working/ latest/ > slang.patch

Заглянуть внутрь файла патча

Давайте быстро заглянем в файл патча. Мы будем использовать less для просмотра его содержимого.

В верхней части файла показаны различия между двумя версиями slang.c.

Прокручивая дальше файл патча, мы видим, что он описывает изменения в другом файле с именем structs.h. Это подтверждает, что файл исправления определенно содержит различия между разными версиями нескольких файлов.

Посмотри, прежде чем прыгнуть

Исправление большой коллекции файлов может немного нервировать, поэтому мы воспользуемся опцией --dry-run , чтобы убедиться, что все в порядке, прежде чем сделать решительный шаг и взять на себя обязательство внести изменения. .

Параметр --dry-run указывает patch делать все, кроме фактического изменения файлов. patch выполнит все предварительные проверки файлов и, если обнаружит какие-либо проблемы, сообщит о них. В любом случае файлы не изменяются.

Если никаких проблем не сообщается, мы можем повторить команду без опции --dry-run и уверенно пропатчить наши файлы.

Параметр -d (каталог) указывает patch, с каким каталогом работать.

Обратите внимание, что мы не используем параметр -i (ввод), чтобы сообщить patch, какой файл исправления содержит инструкции из diff. Вместо этого мы перенаправляем файл исправления в patch с помощью <.

patch --dry-run -ruN -d working < slang.patch

Из всего каталога diff нашел два файла для исправления. Инструкции по внесению изменений в эти два файла были проверены с помощью patch , и никаких проблем обнаружено не было.

Предполетные проверки в порядке; мы готовы к взлету.

Исправление каталога

Чтобы действительно применить исправления к файлам, мы используем предыдущую команду без параметра --dry-run.

patch -ruN -d working < slang.patch

На этот раз каждая строка вывода начинается не с «проверки», а с «исправления».

И никаких проблем не сообщается. Мы можем скомпилировать наш исходный код, и у нас будет последняя версия программного обеспечения.

Уладьте свои разногласия

Это, безусловно, самый простой и безопасный способ использования patch. Скопируйте целевые файлы в папку и исправьте эту папку. Скопируйте их обратно, когда будете довольны тем, что процесс исправления завершился без ошибок.

RELATED: Best Linux Laptops for Developers and Enthusiasts