Jak zastosować łatkę `git diff` bez zainstalowanego Git?


280

W jaki sposób mój klient może zastosować łatkę utworzoną git diffbez zainstalowanego git? Próbowałem użyć patchpolecenia, ale zawsze prosi o nazwę pliku do załatania.


4
Czy ktoś wie, jak to zrobić, jeśli łatka zawiera nazwy? Czy łatka obsługuje teraz natywnie?
Paul Crowley,

3
Pytanie powinno naprawdę brzmieć: czy istnieje sposób na zastosowanie git diff bez zainstalowanego git? Jak wspomniano poniżej , patchnie w pełni obsługuje ten format.
Aryeh Leib Taurog

Odpowiedzi:


425
git diff > patchfile

i

patch -p1 < patchfile

działa, ale jak wiele osób zauważyło w komentarzach i innych odpowiedziach łatka nie rozumie dodawania, usuwania i zmiany nazw. Nie ma opcji, ale git apply patchfilejeśli potrzebujesz obsługi dodawania, usuwania i zmiany nazw plików.


EDYCJA grudnia 2015 r

Najnowsze wersje patchpolecenia (2.7, wydane we wrześniu 2012 r.) Obsługują większość funkcji formatu „diff --git”, w tym zmiany nazw i kopii, zmiany uprawnień i różnice dowiązań symbolicznych (ale jeszcze nie binarne) ( ogłoszenie o wydaniu ).

Więc pod warunkiem, że używa się aktualnej / najnowszej wersji, patchnie ma potrzeby używania, gitaby móc zastosować jego różnicę jako łatkę.


97
Lub użyj git diff > patchfile, alepatch -p1 < patchfile
Jakub Narębski,

11
Jeśli chcesz utworzyć plik łatek podścieżki repozytorium, możesz użyć relativeopcji takiej jak:git diff --no-prefix --relative=my/relative/path > patchfile
Koen.

2
patch -p1 < patchfilenie wymaga zainstalowanego git. Pierwsze polecenie demonstruje polecenie do generowania różnic, a nie zastosowania go.
Andrey Kuznetsov

1
Plaster jest generowany na przemian z branży / refspec wskazanych w poleceniu do aktualnego lub gałąź aktywną. Innymi słowy, chcesz git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfilelubgit diff from_branch to_branch > patchfile; ...
płyty grzewcze

1
@PaulChechetin Jak powiedział egor83 w odpowiedzi suppie, na początku rozcina.
Andrey Kuznetsov,


49

Posługiwać się

git apply patchfile

Jeśli to możliwe.

patch -p1 < patchfile 

ma potencjalny efekt uboczny.

git applyobsługuje także dodawanie, usuwanie i zmianę nazw plików, jeśli są one opisane w git diffformacie, co patchnie jest możliwe. Wreszcie git applyjest modelem „zastosuj wszystko lub przerwij wszystko”, w którym albo wszystko jest zastosowane, albo nic nie ma, podczas gdy łatka może częściowo zastosować pliki łatek, pozostawiając katalog roboczy w dziwnym stanie.


1
+1, jedyna rozsądna odpowiedź. Co więcej, diff / patch nie obsługuje dowiązań symbolicznych, co jest problemem, jeśli (na przykład) cofasz łatę do jądra Linux 3.10.
ignis

10
Tak, git applyto najlepszy sposób, aby to zrobić, ale to pytanie konkretnie pyta, jak zastosować łatkę bez zainstalowanego Git .
Colin D Bennett

1
Opcje --dry-run --verbosesą przydatne, aby określić, jakie będą skutki uboczne, jeśli takie wystąpią. (przy użyciu poprawki v2.5.8)
spyle

@ignis - git apply patchfile -... jedyna rozsądna odpowiedź ...” - to prawie śmieszne. Za każdym razem, gdy deweloperzy OpenSSL wysyłają mi łatkę do przetestowania, Git nie stosuje jej. To za każdym razem. Jeszcze nie widziałem, żeby to głupie narzędzie nakładało łatkę.
jww

8

używam

patch -p1 --merge < patchfile

W ten sposób konflikty można rozwiązać jak zwykle.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.