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.

Andriej Kuzniecow
źródło
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ę.

Andriej Kuzniecow
źródło
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,
75

Spróbuj tego:

patch -p1 < patchfile
suppie
źródło
4
Do czego służy argument -p1?
chrisjlee,
8
Paski tną na początku. Zobacz łatkę dla człowieka
egor83
16
@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.

Sola Yang
źródło
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.

denis.peplin
źródło
-16

Spróbuj tego:

$ git apply file.diff
Shashi
źródło
29
Zobacz pytanie: „bez zainstalowanego gita”
CB Bailey,