Вопрос или проблема
У меня есть каталог с файлами .patch
, созданными с помощью diff.
Я хотел бы применить все эти патчи с помощью patch -p1
к другому каталогу.
Но patch принимает только один файл, если не использовать cat
.
Какой будет команда для применения нескольких файлов с помощью xargs
или аналогичного инструмента.
Если cat
работает, почему бы не использовать его?
Чтобы использовать find
и xargs
:
find dirname -name <namespec> -print0 | xargs -0 -n 1 patch <patchargs>
Пример:
find src/networking -type f -name 'network*.patch' -print0 | xargs -0 -n 1 patch -p2
Предполагая, что вы используете bash/sh/zsh/etc:
cd /path/to/source
for i in /path/to/patches/*.patch; do patch -p1 < "$i"; done
Принятое решение не сработало для меня, похоже оно предполагает, что patch может принять несколько файлов патчей за один раз. Мое решение:
find /tmp/patches -type f -name '*.patch' -print0 | sort -z | xargs -t -0 -n 1 patch -p0 -i
Find: Находит файлы патчей
- /tmp/patches: Каталог для поиска файлов патчей
- -type f: только файлы
- -name ‘*.patch’: файлы, оканчивающиеся на .patch
- -print0: выводит результаты в stdout как список строк, терминированных нулевым символом
Sort: Сортирует файлы патчей, чтобы порядок сохранился (например, 001 следует перед 002)
- -z: входные данные терминированы нулем (так как мы использовали -print0)
xargs: Вызывает patch, используя stdin как аргументы
- -t: Печатает команду перед ее выполнением, можно удалить для уменьшения вербальности
- -0: stdin — это список, терминированный нулем
- -n 1: Вызывает patch для каждого 1 элемента в списке (например, вызывает patch N раз вместо того, чтобы создать список и вызвать его один раз)
- -i: аргумент для patch, чтобы указать, что аргумент будет файлом патча
Это действительно работает (в Bash):
shopt -s globstar
for file in /path/to/patches/**/*.patch
do
patch -p1 < "$file"
done
В Debian используется очень удобный инструмент под названием quilt для управления пакетами.
В Debian/Ubuntu установите его с помощью
sudo apt install quilt
Взгляните на этот очень хороший учебник от Шакти Каннана: Quilt Tutorial, даже если он немного устарел.
Чтобы дать общее представление, взгляните на страницу руководства quilt (1)
:
Quilt — это инструмент для управления большими наборами патчей, отслеживая изменения, которые вносит каждый патч. Патчи могут быть применены, отменены, обновлены и т. д. Основная философская концепция заключается в том, что основным выходным продуктом являются патчи.
С quilt вся работа происходит в пределах единого дерева каталогов. Команды могут быть вызваны из любой точки в дереве исходного кода.Quilt управляет стеком патчей. Патчи применяются поочередно поверх базового дерева плюс все предшествующие патчи. Они могут быть подняты на вершину стека (quilt push) и сняты со стека (quilt pop).
Команды доступны для запроса содержимого файла серии (quilt series, см. ниже), содержимого стека (quilt applied, quilt previous, quilt top) и патчей, которые не применяются в данный момент (quilt next, quilt unapplied). По умолчанию большинство команд применяются к самому верхнему патчу на стеке.
Файл под названием
series
содержит список имен файлов патчей, который определяет порядок, в котором патчи применяются. Если нет средств для автоматической генерации файлов серии, он обычно предоставляется вместе с набором патчей. В этом файле каждое имя файла патча находится на отдельной строке. Файлы патчей идентифицируются путем имен файлов, которые являются относительными к каталогу патчей;
патчи могут находиться в подкаталогах ниже этого каталога. Строки в файле серии, которые начинаются с символа хэша (#), игнорируются.Когда quilt добавляет, удаляет или переименовывает патчи, он автоматически обновляет файл серии. Пользователи quilt могут изменять файлы серии, пока некоторые патчи применены, если примененные патчи остаются в своем первоначальном порядке.
Разные файлы серии могут быть использованы для сбора патчей по-разному, соответствуя, например, разным ветвям разработки.Перед тем, как патч применяется (или «поднимается на стек»), копии всех файлов, которые изменяет патч, сохраняются в каталоге .pc/patch. Патч добавляется в список в данный момент применяемых патчей (.pc/applied-patches). Позже, когда патч генерируется заново (quilt refresh), резервные копии в .pc/patch сравниваются с текущими версиями файлов в дереве исходного кода с помощью GNU diff.
В итоге можно добавить патчи в файл под названием series и управлять им несколькими способами. Можно добавлять, удалять патчи и получить список примененных патчей и т.д.
Ответ или решение
Применение нескольких .patch файлов к директории — задача, часто возникающая в среде ИТ, особенно в контексте разработки ПО и управления версиями. В данном случае пользователь хочет применить несколько файлов патчей, созданных с помощью команды diff, к другой директории, используя команду patch с параметром -p1. Однако возникает проблема, так как программа patch по умолчанию принимает только один файл на вход, если не использовать промежуточные решения вроде cat.
Теория:
Прежде чем углубляться в методы применения нескольких патчей, важно понять, что собой представляют файлы .patch. Это файлы, содержащие различия между двумя версиями текстового файла, и они могут включать изменения, такие как исправление багов, добавление новых функций или обновление документации. Команда patch позволяет применить эти изменения к исходному файлу, преобразуя его в новую версию согласно информации из .patch файла.
Применение патчей вручную, особенно в больших количествах, может быть трудоёмким процессом. Это делает автоматизацию с помощью скриптов и командных инструментов важной задачей в ежедневной практике ИТ-специалистов.
Пример:
Для применения нескольких .patch файлов можно использовать несколько подходов:
-
Использование xargs и find:
Один из способов автоматизации этого процесса — использование команд find и xargs. Этот метод позволяет найти все файлы с расширением .patch в указанной директории и передать их последовательно команде patch.find /tmp/patches -type f -name '*.patch' -print0 | sort -z | xargs -t -0 -n 1 patch -p0 -i
В этой команде:
find
ищет все файлы, соответствующие условию (завершающиеся на .patch) и выводит их с помощью null-терминированного списка (-print0
).sort -z
предназначен для сортировки этих файлов, сохраняя порядок их применения.xargs -0 -n 1 patch -p0 -i
вызывает команду patch для каждого файла отдельно, обеспечивая корректность применения.
-
Скриптовый подход с использованием for-цикла:
Для применения патчей можно использовать оболочку, такую как bash, чтобы организовать простую автоматизацию с помощью for-цикла:cd /path/to/source for i in /path/to/patches/*.patch; do patch -p1 < "$i" done
Этот подход выполняет переход в директорию, где нужно применить патчи, и затем перебирает каждый файл .patch, последовательно применяя его.
-
Использование Quilt для управления патчами:
Quilt — это инструмент, который упрощает управление большими наборами патчей. Он позволяет организовать патчи в стек, применять, отменять и обновлять их.Сначала нужно установить Quilt:
sudo apt install quilt
Затем использовать Quilt для создания и применения патчей через файл серии, который определяет порядок их применения.
Применение:
Выбор между этими методами зависит от конкретных нужд и окружения, в котором работает ИТ-специалист. Например, если количество патчей невелико и они не требуют сложного управления, подойдет использование скрипта с for-циклом. Если же требуется более гибкое средство, которое позволяет управлять сложными последовательностями изменений, Quilt может быть идеальным выбором.
В целом, цель состоит в том, чтобы автоматизировать процесс применения патчей настолько, чтобы он занимал минимальное количество времени и снижал риск ошибок, связанных с человеческим фактором. Этот подход также способствует поддержанию высокого уровня стандартов качества в процессе разработки и обслуживания кода.