Ответы:
Самый распространенный способ создания патча - запустить diff
команду или встроенную diff
команду управления версиями . Иногда вы просто сравниваете два файла и запускаете diff
так:
diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch
Затем вы получаете патч, который содержит изменения для одного файла и не содержит имени файла вообще. Когда вы применяете этот патч, вам нужно указать, к какому файлу вы хотите его применить:
patch <alice_to_bob.patch version2_by_alice.txt
Часто вы сравниваете две версии целого многофайлового проекта, содержащегося в каталоге. Типичный вызов diff
выглядит так:
diff -ru old_version new_version >some.patch
Затем патч содержит имена файлов, указанные в строках заголовка, например diff -ru old_version/dir/file new_version/dir/file
. Вам нужно сказать patch
убрать префикс ( old_version
или new_version
) из имени файла. Вот что -p1
значит: лишить один уровень каталога.
Иногда строки заголовка в патче содержат имя файла напрямую, без предварительного указания. Это часто встречается в системах контроля версий; например, cvs diff
производит строки заголовка, которые выглядят так diff -r1.42 foo
. Тогда нет префикса для удаления, поэтому вы должны указать -p0
.
В особом случае, когда в деревьях, которые вы сравниваете, нет подкаталогов, никакой -p
опции не требуется: patch
будут отбрасываться все части каталога имен файлов. Но в большинстве случаев вам нужно либо, -p0
либо -p1
, в зависимости от того, как был выпущен патч.
diff old/foo new/foo >my.patch
или diff ../old/foo foo >my.patch
или, diff foo.old foo >my.patch
и пользователь мог применять его, patch <my.patch
не заботясь о том, как был создан патч, а затем -p
был добавлен для удобства. Но на самом деле я не знаю, patch
старая ли это утилита, и к тому времени, когда я начал ее использовать, -p0
или -p1
уже были самые распространенные способы ее использования.
От мужчины:
-pnum
или--strip=num
Удалите наименьший префикс, содержащий num начальных слешей из каждого имени файла, найденного в файле исправления. Последовательность одного или нескольких соседних слешей считается за один слеш. Это контролирует, как обрабатываются имена файлов, найденные в файле исправления, в случае, если вы храните файлы в другом каталоге, чем тот, кто отправил исправление. Например, предположим, что имя файла в файле исправления было:/u/howard/src/blurfl/blurfl.c
настройка
-p0
дает полное имя файла без изменений ,-p1
даетu/howard/src/blurfl/blurfl.c
без косой черты ,
-p4
даетblurfl/blurfl.c
Разница в том, что число после -p
будет указывать количество компонентов пути, которые будут удалены.
Скажем, у нас есть путь /Barack/Obama
. Выполнение патча для него с -p0
аргументом будет обрабатывать путь следующим образом :
/Barack/Obama
Но мы можем урезать путь при исправлении:
-p1
удалит корневую косую черту (обратите внимание, что теперь это будет просто Барак, без косой черты):
Barack/Obama
-p2
удалит Барака (и соседний правый слеш):
Obama
Чтобы расширить «почему» этого patch
поведения, прочитайте эту ветку .