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.
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ę.
@chrisjlee git diffumieści a/i b/przedrostki w danych wyjściowych, więc patch -p1pomija je, aby zastosować plik poprawki.
wberry
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, 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.
patch
nie w pełni obsługuje ten format.Odpowiedzi:
i
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 patchfile
jeśli potrzebujesz obsługi dodawania, usuwania i zmiany nazw plików.EDYCJA grudnia 2015 r
Najnowsze wersje
patch
polecenia (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,
patch
nie ma potrzeby używania,git
aby móc zastosować jego różnicę jako łatkę.źródło
git diff > patchfile
, alepatch -p1 < patchfile
relative
opcji takiej jak:git diff --no-prefix --relative=my/relative/path > patchfile
patch -p1 < patchfile
nie wymaga zainstalowanego git. Pierwsze polecenie demonstruje polecenie do generowania różnic, a nie zastosowania go.git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfile
lubgit diff from_branch to_branch > patchfile; ...
Spróbuj tego:
źródło
git diff
umieścia/
ib/
przedrostki w danych wyjściowych, więcpatch -p1
pomija je, aby zastosować plik poprawki.Posługiwać się
Jeśli to możliwe.
ma potencjalny efekt uboczny.
git apply
obsługuje także dodawanie, usuwanie i zmianę nazw plików, jeśli są one opisane wgit diff
formacie, copatch
nie jest możliwe. Wreszciegit apply
jest 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.źródło
git apply
to najlepszy sposób, aby to zrobić, ale to pytanie konkretnie pyta, jak zastosować łatkę bez zainstalowanego Git .--dry-run --verbose
są przydatne, aby określić, jakie będą skutki uboczne, jeśli takie wystąpią. (przy użyciu poprawki v2.5.8)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ę.używam
W ten sposób konflikty można rozwiązać jak zwykle.
źródło
Spróbuj tego:
źródło