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.