2010-08-05 6 views
258

W jaki sposób mój klient może zastosować poprawkę utworzoną przez git diff bez zainstalowanego git? Próbowałem użyć polecenia patch, ale zawsze prosi o nazwę pliku do poprawki.Jak zastosować łatkę `git diff` bez zainstalowanego Git?

+4

Czy ktoś wie, jak to zrobić, jeśli plaster zawiera nazwy? Czy łata obsługuje teraz to teraz? –

+3

Pytanie powinno być następujące: * czy istnieje sposób * na zastosowanie diff git bez zainstalowanego git? [Jak zauważono poniżej] (http://stackoverflow.com/a/17958129/519015), 'patch' nie obsługuje w pełni tego formatu. –

Odpowiedz

391
git diff > patchfile 

i

patch -p1 < patchfile 

praca, ale jak wiele osób zauważyło w komentarzach i innych odpowiedzi plastra nie rozumie dodaje, usuwa i zmienia nazwy. Nie ma innej opcji niż git apply patchfile, jeśli potrzebujesz obsługi plików, dodaje i usuwa nazwy.


EDIT grudnia 2015

Najnowsze wersje patch Command (2.7, wydany we wrześniu 2012) wsparcia większość cech formacie "diff", w tym --git zmienia nazwę i kopie, zmiany uprawnień i dowiązania symboliczne różnią się o (ale nie są jeszcze różnicami binarnymi) (release announcement).

Tak więc pod warunkiem, że używa się aktualnej/najnowszej wersji patch, nie ma potrzeby używania git, aby móc zastosować jej różnicę jako łatkę.

+96

Lub użyj 'git diff> patchfile', ale' łatka-p1

+10

Jeśli chcesz utworzyć plik łaty ścieżki podrzędnej repozytorium, możesz użyć opcji 'relative' jak:' git diff --no-prefix --relative = my/relative/path> patchfile' –

+0

Czy to nie wymaga instalacji git? Pytanie brzmi: jak to zrobić bez git, prawda? – UpTheCreek

-9

Spróbuj tego:

$ git apply file.diff 
+25

Zobacz pytanie: "bez zainstalowanego git" –

+1

Dzięki, to działa również dla użytkowników Windows. – motto

+3

Rewizja, ponieważ OP mówi: "bez zainstalowanego git" – scrapcodes

72

spróbuj tego:

patch -p1 < patchfile 
+4

Co robi argument -p1? – chrisjlee

+8

Paskuje slash na początku. Zobacz [łatka man] (http://unixhelp.ed.ac.uk/CGI/man-cgi?patch+1) – egor83

+14

@chrisjlee 'git diff' wstawi przedrostki' a/'i' b/'na wyjściu , więc 'patch -p1' zaniedbuje te, aby zastosować plik łatki. – wberry

47

Korzystając

git apply patchfile 

jeśli to możliwe.

patch -p1 < patchfile 

ma potencjalny efekt uboczny.

git apply obsługuje również dodawanie, usuwanie i nazwy plików, jeśli są one opisane w formacie git diff, których nie będzie można uzyskać pod patch. Wreszcie, git apply jest modelem "zastosuj wszystko lub przerwij wszystko", w którym wszystko jest zastosowane lub nic nie jest, podczas gdy łatka może częściowo nakładać pliki łat, pozostawiając twój katalog roboczy w dziwnym stanie.

+1

+1, Jedyna rozsądna odpowiedź. Co więcej, diff/patch nie będzie obsługiwać dowiązań symbolicznych, co stanowi problem, jeśli (na przykład) cofniesz łatkę jądra systemu Linux 3.10. – ignis

+8

Tak, 'git apply' jest najlepszym sposobem, aby to zrobić, ale to pytanie w szczególności pyta, jak zastosować łatkę * bez zainstalowanego Git *. –

+0

Opcje '--dry-run --verbose' są przydatne do określenia efektów ubocznych, jeśli takie istnieją. (używając łatki v2.5.8) – spyle

5

używam

patch -p1 --merge < patchfile 

ten sposób konflikt może być rozwiązany jak zwykle.