Применить несколько файлов.patch
У меня есть каталог с .patch
файлы, созданные с использованием diff.
Я хотел бы применить все эти патчи, используя patch -p1
в другой каталог.
Но патч занимает только один файл, если я cat
,
Какой будет команда применить несколько файлов, используя xargs
или похожий инструмент.
5 ответов
Если cat
работает, почему бы не использовать его?
Использовать find
а также xargs
:
find dirname -name namespec -print0 | xargs -0 patch patchargs
Пример:
find src/networking -type f -name 'network*.patch' -print0 | xargs -0 patch -p2
Предполагая, что вы используете bash/sh/zsh и т.д...
cd /path/to/source
for i in /path/to/patches/*.patch; do patch -p1 < $i; done
Принятый ответ не работает для меня, кажется, предполагается, что патч может принимать несколько файлов патчей в одной командной строке. Мое решение:
find /tmp/patches -type f -name '*.patch' -print0 | sort -z | xargs -t -0 -n 1 patch -p0 -i
Найти: находит файлы патчей
- /tmp/patches: каталог для поиска файлов патчей в
- тип f: только файлы
- -name '*.patch': файлы, оканчивающиеся на.patch
- -print0: выводить результаты в стандартный вывод в виде списка строк с нулевым символом в конце
Сортировка: сортирует файлы патчей, поэтому порядок сохраняется (например, 001 предшествует 002)
- -z: ввод завершается нулем (так как мы использовали -print0)
xargs: вызов патча с использованием stdin в качестве аргументов
- -t: команда печати перед запуском, может удалить ее для уменьшения детализации
- -0: stdin - список с нулевым окончанием
- -n 1: вызвать патч снова для каждого 1 элемента в списке (например, вызвать патч N раз, вместо того, чтобы создавать список и вызывать его один раз)
- -i: аргумент к патчу, чтобы сказать ему, что аргумент будет патч-файлом
Это на самом деле работает (в 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 — это инструмент для управления большими наборами патчей путем отслеживания изменений, вносимых каждым патчем. Исправления можно применять, не применять, обновлять и т. д. Ключевая философская концепция заключается в том, что вашим основным результатом являются исправления. При использовании quilt вся работа происходит в одном дереве каталогов. Команды можно вызывать из любого места исходного дерева.
Quilt управляет стопкой патчей. Исправления применяются постепенно поверх базового дерева плюс все предыдущие исправления. Их можно положить на вершину стопки (нажатие лоскутного одеяла) и вытолкнуть из стопки (вытолкнуть лоскутное одеяло).
Доступны команды для запроса содержимого файла серии (quilt series, см. ниже), содержимого стека (quilt apply, quilt previous, quilt top) и патчей, которые не применяются в конкретный момент (quilt next, одеяло не наложено). По умолчанию большинство команд применяются к самому верхнему патчу в стеке.
Файл под названием
содержит список имен файлов исправлений, определяющий порядок применения исправлений. Если не существует средств, с помощью которых файлы серий могут генерироваться автоматически, они обычно предоставляются вместе с набором исправлений. В этом файле имя каждого файла патча находится на отдельной строке. Файлы исправлений идентифицируются по именам путей, относящимся к каталогу исправлений; патчи могут находиться в подкаталогах ниже этого каталога. Строки в файле серии, начинающиеся с символа решетки (#), игнорируются. Когда quilt добавляет, удаляет или переименовывает патчи, он автоматически обновляет файл серии. Пользователи quilt могут изменять файлы серии во время применения некоторых исправлений, при условии, что примененные исправления остаются в исходном порядке. Файлы разных серий можно использовать для сборки патчей по-разному, например, в соответствии с разными ветвями разработки.
Прежде чем патч будет применен (или «помещен в стек»), копии всех файлов, изменяемых патчем, сохраняются в каталоге .pc/patch. Патч добавляется в список применяемых в данный момент патчей (.pc/applied-patches). Позже, когда патч регенерируется (обновление quilt), резервные копии в .pc/patch сравниваются с текущими версиями файлов в дереве исходного кода с помощью GNU diff.
Подводя итог, вы можете добавлять патчи в файл под названием series и управлять им несколькими способами. Вы можете добавлять, удалять патчи и получать список примененных патчей...