patch — применение diff-файла к оригиналу

Программа patch используется для применения изменений к текстовым файлам. Она принимает вывод программы diff и обычно используется для преобразования старых версий файлов в более новые. Рассмотрим один известный пример. Ядро Linux разрабатывается большой, свободно организованной группой разработчиков, от которых неиссякаемым потоком идут небольшие изменения в исходном коде. Ядро Linux включает миллионы строк программного кода, но изменения, присылаемые одним разработчиком за один раз, очень невелики. Разработчикам нет смысла пересылать все дерево исходных текстов ядра всякий раз, когда вносится небольшое изменение. Вместо этого они присылают diff-файлы. Эти файлы описывают различия между предыдущей версией ядра и новой, включающей изменения разработчика. Другой разработчик, получивший такое изменение, использует программу patch, позволяющую применить предложенное изменение к своему дереву исходных текстов. Использование пары программ diff/patch дает два важных преимущества:

• diff-файл очень невелик в сравнении с полным деревом исходных текстов;

• diff-файл наглядно показывает произведенные изменения, что позволяет экспертам быстро применить эти изменения и оценить их.

Разумеется, пару diff/patch можно применять к любым текстовым файлам, не только к исходному коду. Эти программы с таким же успехом можно применять к конфигурационным файлам или другому тексту.

Чтобы подготовить diff-файл для последующего его применения программой patch, документация GNU предлагает использовать diff, как показано ниже:

diff -Naur старый_файл новый_файл > diff_файл

где старый_файл и новый_файл могут быть одиночными файлами или каталогами. Параметр r поддерживает рекурсивный обход вложенных подкаталогов.

Получив diff-файл, его можно применить к старому файлу, чтобы получить новый:

patch < diff_файл

Продемонстрируем это на примере нашего тестового файла:

[me@linuxbox ~]$ diff -Naur file1.txt file2.txt > patchfile.txt

[me@linuxbox ~]$ patch < patchfile.txt

patching file file1.txt

[me@linuxbox ~]$ cat file1.txt

b

c

d

e

В этом примере мы создали diff-файл с именем patchfile.txt и затем воспользовались программой patch, чтобы применить его (наложить «заплату»). Обратите внимание, что нам не пришлось указывать целевой файл, потому что diff-файл (в унифицированном формате) уже содержит имена файлов в заголовке. После наложения «заплаты» содержимое file1.txt точно соответствует содержимому file2.txt.

Программа patch имеет большое число параметров, а кроме того, существует множество вспомогательных программ, которые помогут в правке «заплат» (diff-файлов).