При исправлении в чем разница между аргументами -p0 и -p1?

19

Какая разница между patch -p0а patch -p1?

Есть ли разница?

chrisjlee
источник

Ответы:

23

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

Жиль "ТАК - прекрати быть злым"
источник
Это смущало меня так долго. Почему поведение подкаталогов не отличается от -p0? Я всегда предполагал, что -p0 был по умолчанию, поэтому у меня всегда были проблемы, если предполагалось, что это p0
Брайдон Гибсон
@BrydonGibson Я подозреваю, что изначально идея заключалась в том, что автор патча мог писать равнодушно 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уже были самые распространенные способы ее использования.
Жиль "ТАК - прекрати быть злым"
16

От мужчины:

-pnum или --strip=num Удалите наименьший префикс, содержащий num начальных слешей из каждого имени файла, найденного в файле исправления. Последовательность одного или нескольких соседних слешей считается за один слеш. Это контролирует, как обрабатываются имена файлов, найденные в файле исправления, в случае, если вы храните файлы в другом каталоге, чем тот, кто отправил исправление. Например, предположим, что имя файла в файле исправления было:

 /u/howard/src/blurfl/blurfl.c

настройка -p0дает полное имя файла без изменений , -p1дает

 u/howard/src/blurfl/blurfl.c

без косой черты , -p4дает

 blurfl/blurfl.c
Стефан Хименес
источник
4

Разница в том, что число после -pбудет указывать количество компонентов пути, которые будут удалены.

Скажем, у нас есть путь /Barack/Obama. Выполнение патча для него с -p0аргументом будет обрабатывать путь следующим образом :

/Barack/Obama

Но мы можем урезать путь при исправлении:

-p1удалит корневую косую черту (обратите внимание, что теперь это будет просто Барак, без косой черты):

Barack/Obama

-p2 удалит Барака (и соседний правый слеш):

 Obama

Чтобы расширить «почему» этого patchповедения, прочитайте эту ветку .

JohnDoea
источник