patch

1. Что такое patch и зачем он нужен

Команда patch – стандартный инструмент Unix‑подобных систем для применения изменений к исходным файлам. Она читает «diff»‑файлы (патчи), содержащие набор инструкций по добавлению, удалению или изменению строк, и автоматически вносит эти изменения в целевые файлы.

Преимущества:

  • Эффективность – патч применяется быстро даже к большим проектам.
  • Версионирование – легко откатить изменения с помощью patch -R.
  • Совместимость – работает со всеми текстовыми форматами, поддерживает контекстные и унифицированные diff‑форматы.

2. Структура патча

Патч обычно создаётся командой diff:

Bash
diff -u old_file new_file > change.patch

Стандартный формат включает:

  • Заголовки --- и +++, указывающие исходный и целевой файлы.
  • Метки контекста, начинающиеся с @@.
  • Линии, начинающиеся на +- или пробел (неизменённые).

2.1 Пример патча

Bash
--- a/example.c
+++ b/example.c
@@ -10,7 +10,8 @@
 int main() {
     printf("Hello\n");
-    return 0;
+    // добавлено логирование
+    log_start();
     return 0;
 }

3. Применение патча

3.1 Базовый синтаксис

Bash
patch < patch_file

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

3.2 Параметры для контроля процесса

ПараметрОписание
-pNУбирает первые N слэшей из путей файлов в патче.
-i fileЧитает патч из указанного файла вместо stdin.
-bСоздаёт резервную копию оригинальных файлов с суффиксом .orig.
-RОткатывает уже применённый патч (реверс).
--dry-runПоказывает, какие изменения будут внесены без фактического применения.

3.3 Пример использования

Bash
patch -p1 -i changes.patch

Если патч содержит относительные пути ../src/file.c, то опция -p1 убирает один слэш и ищет файл в текущем каталоге.

4. Советы по работе с patch

4.1 Работа с большим количеством файлов

Для больших проектов удобно использовать git apply вместо patch, но если Git не установлен, можно объединить патчи:

Bash
cat *.patch | patch -p0

4.2 Устранение конфликтов

Если в процессе применения возникает конфликт (разница между патчем и файлом), patch создаёт файлы с расширением .rej. Их нужно вручную отредактировать:

Bash
vi file.c.rej

После исправления можно заново применить патч.

4.3 Проверка idempotence

Патч должен быть идемпотентным: многократное применение не меняет результат. Проверьте, запустив patch -R и затем снова patch.

5. Интеграция в CI/CD

В пайплайнах можно добавить шаг:

Bash
- name: Apply patches
  run: patch -p1 -i fixes.patch || exit 0

Так патчи автоматически применяются к исходникам перед сборкой.