Відповіді:
Найпоширеніший спосіб створити патч - це запустити 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
поведінки, прочитайте цю тему .