Відповіді:
Найпоширеніший спосіб створити патч - це запустити 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
Різниця полягає в тому, що число after -pвказало б кількість компонентів шляху, які будуть видалені.
Скажіть, у нас є шлях /Barack/Obama. Виконання патча на -p0аргументі трактує шлях так :
/Barack/Obama
Але ми можемо обрізати шлях під час виправлення:
-p1видалить кореневу косу рису (зауважте, що це буде просто Барак зараз, без косою рисою)
Barack/Obama
-p2 видалить Барак (та сусідній правий нахил):
Obama
Щоб розширити питання "чому" такої patchповедінки, прочитайте цю тему .