Podczas łatania jaka jest różnica między argumentami -p0 i -p1?

19

Jaka jest różnica między patch -p0i patch -p1?

Czy w ogóle jest jakaś różnica?

chrisjlee
źródło

Odpowiedzi:

23

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.

Gilles „SO- przestań być zły”
źródło
Tak długo mnie to myliło. Dlaczego zachowanie podkatalogów nie różni się od -p0? Zawsze zakładałem, że -p0 było domyślne, więc zawsze miałem problemy, jeśli miałoby to być p0
Brydon Gibson
@BrydonGibson Podejrzewam, że pierwotnie pomysł polegał na tym, że autor łatki mógł obojętnie napisać 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.
Gilles „SO- przestań być zły”
16

Od mężczyzny:

-pnum lub --strip=num Usuń 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.c

ustawienie -p0daje całą nazwę pliku niezmodyfikowaną , -p1daje

 u/howard/src/blurfl/blurfl.c

bez wiodącego ukośnika , -p4daje

 blurfl/blurfl.c
Stéphane Gimenez
źródło
4

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 .

JohnDoea
źródło