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


19

Яка різниця між patch -p0і patch -p1?

Чи взагалі є якась різниця?

Відповіді:


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

Різниця полягає в тому, що число after -pвказало б кількість компонентів шляху, які будуть видалені.

Скажіть, у нас є шлях /Barack/Obama. Виконання патча на -p0аргументі трактує шлях так :

/Barack/Obama

Але ми можемо обрізати шлях під час виправлення:

-p1видалить кореневу косу рису (зауважте, що це буде просто Барак зараз, без косою рисою)

Barack/Obama

-p2 видалить Барак (та сусідній правий нахил):

 Obama

Щоб розширити питання "чому" такої patchповедінки, прочитайте цю тему .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.