patch
1. Что такое patch и зачем он нужен
Команда patch – стандартный инструмент Unix‑подобных систем для применения изменений к исходным файлам. Она читает «diff»‑файлы (патчи), содержащие набор инструкций по добавлению, удалению или изменению строк, и автоматически вносит эти изменения в целевые файлы.
Преимущества:
- Эффективность – патч применяется быстро даже к большим проектам.
- Версионирование – легко откатить изменения с помощью
patch -R. - Совместимость – работает со всеми текстовыми форматами, поддерживает контекстные и унифицированные diff‑форматы.
2. Структура патча
Патч обычно создаётся командой diff:
diff -u old_file new_file > change.patchСтандартный формат включает:
- Заголовки
---и+++, указывающие исходный и целевой файлы. - Метки контекста, начинающиеся с
@@. - Линии, начинающиеся на
+,-или пробел (неизменённые).
2.1 Пример патча
--- a/example.c
+++ b/example.c
@@ -10,7 +10,8 @@
int main() {
printf("Hello\n");
- return 0;
+ // добавлено логирование
+ log_start();
return 0;
}3. Применение патча
3.1 Базовый синтаксис
patch < patch_fileКоманда читает патч из стандартного ввода и применяет изменения к файлам, указанным в заголовках.
3.2 Параметры для контроля процесса
| Параметр | Описание |
|---|---|
-pN | Убирает первые N слэшей из путей файлов в патче. |
-i file | Читает патч из указанного файла вместо stdin. |
-b | Создаёт резервную копию оригинальных файлов с суффиксом .orig. |
-R | Откатывает уже применённый патч (реверс). |
--dry-run | Показывает, какие изменения будут внесены без фактического применения. |
3.3 Пример использования
patch -p1 -i changes.patchЕсли патч содержит относительные пути ../src/file.c, то опция -p1 убирает один слэш и ищет файл в текущем каталоге.
4. Советы по работе с patch
4.1 Работа с большим количеством файлов
Для больших проектов удобно использовать git apply вместо patch, но если Git не установлен, можно объединить патчи:
cat *.patch | patch -p04.2 Устранение конфликтов
Если в процессе применения возникает конфликт (разница между патчем и файлом), patch создаёт файлы с расширением .rej. Их нужно вручную отредактировать:
vi file.c.rejПосле исправления можно заново применить патч.
4.3 Проверка idempotence
Патч должен быть идемпотентным: многократное применение не меняет результат. Проверьте, запустив patch -R и затем снова patch.
5. Интеграция в CI/CD
В пайплайнах можно добавить шаг:
- name: Apply patches
run: patch -p1 -i fixes.patch || exit 0Так патчи автоматически применяются к исходникам перед сборкой.