Odpowiedzi:
Najczęstszym sposobem utworzenia poprawki jest uruchomienie diff
polecenia lub wbudowanego diff
polecenia kontroli wersji . Czasami po prostu porównujesz dwa pliki i działasz w diff
nastę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 diff
wyglą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ć, patch
aby usunąć prefiks ( old_version
lub new_version
) z nazwy pliku. To -p1
znaczy: 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 diff
tworzy 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 -p
opcja nie jest konieczna: patch
odrzuci całą część katalogu z nazwami plików. Ale przez większość czasu potrzebujesz albo, -p0
albo -p1
, w zależności od tego, jak łatka została wyprodukowana.
diff old/foo new/foo >my.patch
lub diff ../old/foo foo >my.patch
lub diff foo.old foo >my.patch
użytkownik mógł go zastosować patch <my.patch
bez konieczności dbania o to, jak łatka została wyprodukowana, a następnie -p
została dodana dla wygody. Ale tak naprawdę nie wiem, patch
jest to stare narzędzie i zanim zacząłem go używać -p0
lub -p1
były już najczęstszymi sposobami korzystania z niego.
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
-p0
daje całą nazwę pliku niezmodyfikowaną ,-p1
dajeu/howard/src/blurfl/blurfl.c
bez wiodącego ukośnika ,
-p4
dajeblurfl/blurfl.c
Różnica polega na tym, że liczba po -p
określa liczbę komponentów ścieżki, które zostaną usunięte.
Powiedzmy, że mamy ścieżkę /Barack/Obama
. Wykonanie na nim łatki z -p0
argumentem traktuje ścieżkę w następujący sposób :
/Barack/Obama
Ale możemy przyciąć ścieżkę podczas łatania:
-p1
usunie 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 patch
zachowania, przeczytaj ten wątek .