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

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

Команды patch и diff

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

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

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

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

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

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

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

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

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

  Как организовать свои списки в Linux с помощью Dynalist

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

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

Команда diff находит различия между двумя файлами. Его действие по умолчанию — выводить список измененных строк в окне терминала.

Один файл называется slang.c. Мы сравним версию в рабочем каталоге с версией в последнем каталоге.

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

Мы предоставляем имена файлов, чтобы diff знал, какие файлы сравнивать. Первым отображается исходный файл, затем измененный файл. Это команда, которую мы выдаем для сравнения:

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

diff -u working / slang.s latest / slang.c в окне терминала

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

вывод из diff в окне терминала

Создание файла патча

Чтобы зафиксировать эти различия в файле исправления, используйте следующую команду. Это та же команда, что и выше, но вывод команды diff перенаправляется в файл с именем slang.patch.

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

diff -u working / slang.c latest / 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> Чтобы заставить исправление воздействовать на файл исправления и изменить файл working / slang.c, используйте следующую команду.  Параметр -u (унифицированный) сообщает патчу, что файл патча содержит унифицированные контекстные строки.  Другими словами, мы использовали параметр -u с diff, поэтому мы используем параметр -u с патчем. </p>
<div style=

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

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

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

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

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

patch -u working.slang.c -i slang.patch в окне терминала

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

вывод ls в окне терминала

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

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

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

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

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

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

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 =Заглядывать внутрь файла исправления

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

  Как использовать браузер Pale Moon в Linux

меньше сленга. патч в окне терминала

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

less slang.patch, показывающий верхнюю часть файла в окне терминала

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

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

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

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

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

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

Параметр -d (каталог) сообщает патчу, с каким каталогом работать.

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

patch --dry-run -ruN -d working 

patch --dry-run -ruN -d working <slang.patch в окне терминала

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 

patch -ruN -d working <slang.patch в окне терминала

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

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

Урегулируйте свои разногласия

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