Ответы:
Самый распространенный способ создания патча - запустить 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поведения, прочитайте эту ветку .