Odpowiedzi:
Najczęstszym sposobem utworzenia poprawki jest uruchomienie diffpolecenia lub wbudowanego diffpolecenia kontroli wersji . Czasami po prostu porównujesz dwa pliki i działasz w diffnastępujący sposób:
diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch
Następnie otrzymujesz łatkę, która zawiera zmiany dla jednego pliku i w ogóle nie zawiera nazwy pliku. Po zastosowaniu tej poprawki musisz określić, do którego pliku chcesz ją zastosować:
patch <alice_to_bob.patch version2_by_alice.txt
Często porównujesz dwie wersje całego projektu z wieloma plikami zawartymi w katalogu. Typowe wywołanie diffwygląda następująco:
diff -ru old_version new_version >some.patch
Następnie łatka zawiera nazwy plików podane w wierszach nagłówka, takich jak diff -ru old_version/dir/file new_version/dir/file. Musisz powiedzieć, patchaby usunąć prefiks ( old_versionlub new_version) z nazwy pliku. To -p1znaczy: usuń jeden poziom katalogu.
Czasami wiersze nagłówka w łatce zawierają nazwę pliku bezpośrednio, bez wstępu. Jest to powszechne w systemach kontroli wersji; na przykład cvs difftworzy linie nagłówka, które wyglądają jak diff -r1.42 foo. Następnie nie ma przedrostka do usunięcia, więc musisz go określić -p0.
W szczególnym przypadku, gdy w porównywanych drzewach nie ma podkatalogów, żadna -popcja nie jest konieczna: patchodrzuci całą część katalogu z nazwami plików. Ale przez większość czasu potrzebujesz albo, -p0albo -p1, w zależności od tego, jak łatka została wyprodukowana.
diff old/foo new/foo >my.patchlub diff ../old/foo foo >my.patchlub diff foo.old foo >my.patchużytkownik mógł go zastosować patch <my.patchbez konieczności dbania o to, jak łatka została wyprodukowana, a następnie -pzostała dodana dla wygody. Ale tak naprawdę nie wiem, patchjest to stare narzędzie i zanim zacząłem go używać -p0lub -p1były już najczęstszymi sposobami korzystania z niego.
Od mężczyzny:
-pnumlub--strip=numUsuń najmniejszy prefiks zawierający liczbę wiodących ukośników z każdej nazwy pliku znalezionej w pliku poprawki. Sekwencja jednego lub więcej sąsiadujących ukośników jest liczona jako pojedynczy ukośnik. Kontroluje to, w jaki sposób traktowane są nazwy plików znalezione w pliku łatki, na wypadek gdybyś trzymał swoje pliki w innym katalogu niż osoba, która wysłała łatkę. Na przykład załóżmy, że nazwa pliku w pliku poprawki to:/u/howard/src/blurfl/blurfl.custawienie
-p0daje całą nazwę pliku niezmodyfikowaną ,-p1dajeu/howard/src/blurfl/blurfl.cbez wiodącego ukośnika ,
-p4dajeblurfl/blurfl.c
Różnica polega na tym, że liczba po -pokreśla liczbę komponentów ścieżki, które zostaną usunięte.
Powiedzmy, że mamy ścieżkę /Barack/Obama. Wykonanie na nim łatki z -p0argumentem traktuje ścieżkę w następujący sposób :
/Barack/Obama
Ale możemy przyciąć ścieżkę podczas łatania:
-p1usunie główny ukośnik (zwróć uwagę, że będzie to teraz Barack, bez ukośnika):
Barack/Obama
-p2 usunie Baracka (i sąsiadujący prawy ukośnik):
Obama
Aby rozwinąć „dlaczego” tego patchzachowania, przeczytaj ten wątek .