Команда патча Linux позволяет быстро и безопасно переносить изменения из одного набора файлов в другой набор файлов. Узнайте, как использовать патч простым способом.
Оглавление
Команды patch и diff
Представьте, что у вас на компьютере есть текстовый файл. Вы получаете измененную версию этого текстового файла от кого-то другого. Как быстро перенести все изменения из измененного файла в исходный? Вот где в игру вступают патчи и различия. patch и diff можно найти в Linux и других Unix-подобных операционных системах, таких как macOS.
Команда diff проверяет две разные версии файла и перечисляет различия между ними. Различия могут быть сохранены в файле, который называется файлом исправления.
Команда patch может читать файл исправления и использовать его содержимое как набор инструкций. Следуя этим инструкциям, изменения в измененном файле воспроизведен в оригинале файл.
Теперь представьте, что этот процесс происходит со всем каталогом текстовых файлов. Все за один раз. В этом сила патча.
Иногда вам не отправляют измененные файлы. Все, что вам отправят, — это файл с исправлением. Зачем пересылать десятки файлов, если можно отправить один файл или опубликовать один файл для удобной загрузки?
Что вы делаете с файлом патча, чтобы исправить ваши файлы? Помимо того, что это почти скороговорка, это еще и хороший вопрос. Мы расскажем вам об этом в этой статье.
Команда patch чаще всего используется людьми, работающими с файлами исходного кода программного обеспечения, но она одинаково хорошо работает с любым набором текстовых файлов, независимо от их назначения, исходного кода или нет.
Наш пример сценария
В этом сценарии мы находимся в каталоге с именем work, который содержит два других каталога. Один называется рабочим, а другой последним. Рабочий каталог содержит набор файлов исходного кода. В последнем каталоге хранится самая последняя версия этих файлов исходного кода, некоторые из которых были изменены.
На всякий случай рабочий каталог является копией текущей версии текстовых файлов. Это не единственная их копия.
Поиск различий между двумя версиями файла
Команда diff находит различия между двумя файлами. Его действие по умолчанию — выводить список измененных строк в окне терминала.
Один файл называется slang.c. Мы сравним версию в рабочем каталоге с версией в последнем каталоге.
Параметр -u (унифицированный) указывает diff также перечислить некоторые из неизмененных текстовых строк до и после каждого из измененных разделов. Эти строки называются контекстными строками. Они помогают команде patch точно определить, где в исходном файле нужно внести изменения.
Мы предоставляем имена файлов, чтобы 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 -u working.slang.c -i slang.patch
Если все пойдет хорошо, будет одна строка вывода, говорящая, что патч исправляет файл.
Создание резервной копии исходного файла
Мы можем указать патчу сделать резервную копию исправленных файлов перед их изменением, используя параметр -b (резервное копирование). Параметр -i (input) сообщает patch имя файла исправления, который следует использовать:
patch -u -b working.slang.c -i slang.patch
Файл исправлен, как и раньше, без видимой разницы в выводе. Однако, если вы посмотрите в рабочую папку, вы увидите, что файл с именем slang.c.orig был создан. Отметки даты и времени файлов показывают, что slang.c.orig — это исходный файл, а slang.c — новый файл, созданный патчем.
Использование diff с каталогами
Мы можем использовать diff для создания файла патча, который содержит все различия между файлами в двух каталогах. Затем мы можем использовать этот файл патча с патчем, чтобы применить эти различия к файлам в рабочей папке с помощью одной команды.
Параметры, которые мы собираемся использовать с diff, — это параметр -u (унифицированный контекст), который мы использовали ранее, параметр -r (рекурсивный), чтобы diff просматривал любые подкаталоги, и параметр -N (новый файл).
Параметр -N сообщает diff, как обрабатывать файлы в последнем каталоге, которых нет в рабочем каталоге. Он заставляет diff помещать инструкции в файл патча, чтобы патч создавал файлы, которые присутствуют в последнем каталоге, но отсутствуют в рабочем каталоге.
Вы можете сгруппировать параметры вместе, чтобы использовать один дефис (-).
Обратите внимание, что мы предоставляем только имена каталогов, мы не говорим diff просматривать определенные файлы:
diff -ruN working/ latest/ > slang.patch
Заглядывать внутрь файла исправления
Давайте быстро заглянем в файл патча. Мы будем использовать меньше, чтобы просмотреть его содержимое.
Вверху файла показаны различия между двумя версиями slang.c.
Прокручивая файл патча дальше вниз, мы видим, что он затем описывает изменения в другом файле с именем Structs.h. Это подтверждает, что файл исправления определенно содержит различия между разными версиями нескольких файлов.
Посмотрите, прежде чем прыгать
Исправление большой коллекции файлов может немного нервировать, поэтому мы собираемся использовать параметр –dry-run, чтобы убедиться, что все в порядке, прежде чем мы сделаем решительный шаг и обязуемся внести изменения.
Параметр –dry-run указывает патчу делать все, кроме фактического изменения файлов. patch выполнит все предполетные проверки файлов и, если обнаружит какие-либо проблемы, сообщит о них. В любом случае файлы не изменяются.
Если о проблемах не сообщается, мы можем повторить команду без опции –dry-run и уверенно исправить наши файлы.
Параметр -d (каталог) сообщает патчу, с каким каталогом работать.
Обратите внимание, что мы не используем параметр -i (ввод), чтобы указать патчу, какой файл патча содержит инструкции из diff. Вместо этого мы перенаправляем файл патча в patch с помощью <. wp_automatic_readability="17.5">
patch --dry-run -ruN -d workingOut 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На этот раз каждая строка вывода не начинается с «проверки», каждая строка начинается с «исправления».
И никаких проблем не сообщается. Мы можем скомпилировать наш исходный код, и у нас будет последняя версия программного обеспечения.
Урегулируйте свои разногласия
Это, безусловно, самый простой и безопасный способ использования патча. Скопируйте целевые файлы в папку и исправьте эту папку. Скопируйте их обратно, когда будете уверены, что процесс исправления завершился без ошибок.