Какая разница между patch -p0
а patch -p1
?
Есть ли разница?
Самый распространенный способ создания патча - запустить 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
уже были самые распространенные способы ее использования.От мужчины:
источник
Разница в том, что число после
-p
будет указывать количество компонентов пути, которые будут удалены.Скажем, у нас есть путь
/Barack/Obama
. Выполнение патча для него с-p0
аргументом будет обрабатывать путь следующим образом :Но мы можем урезать путь при исправлении:
-p1
удалит корневую косую черту (обратите внимание, что теперь это будет просто Барак, без косой черты):-p2
удалит Барака (и соседний правый слеш):Чтобы расширить «почему» этого
patch
поведения, прочитайте эту ветку .источник