Utwórz plik poprawki lub pliku różnic z repozytorium git i zastosuj go do innego innego repozytorium git

155

Pracuję nad projektem opartym na WordPressie i chcę aktualizować mój projekt w każdej nowej wersji WP. W tym celu chcę wygenerować łatkę między dwoma zatwierdzeniami lub tagami.

Na przykład w moim repozytorium /www/WProbię to:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

Lub

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif WordPress

/www/myproject Mój projekt git oparty na WordPressie

Wydaje git applymi się, że linia poleceń nie działa, ponieważ jesteśmy w różnych repozytoriach.

Czy mogę wygenerować plik poprawki bez zatwierdzenia, tylko różnicę i zastosować go do innego repozytorium git?

Z góry dzięki.

zatamine
źródło

Odpowiedzi:

243

Możesz po prostu użyć git diffdo stworzenia zunifikowanego porównania odpowiedniego dla git apply:

git diff tag1..tag2 > mypatch.patch

Następnie możesz zastosować wynikową łatkę za pomocą:

git apply mypatch.patch
Enrico Campidoglio
źródło
1
Dziękuję Enrico, użyłem $git diff -u tag1..tag2 > mypatch.patchi $git apply --stat > mypatch.patchczy mam 0 files changedjakieś inne sugestie? :)
zatamine
Musisz podać ścieżkę do pliku poprawki jako argument git apply. Zaktualizowałem moją odpowiedź przykładem.
Enrico Campidoglio
1
Użyłem, git diff -p tag1 tag2 > my.patchco działało dobrze.
Barclay
Jak zrobić poprawki w ujednoliconym formacie różnicowym? sourceware.org/glibc/wiki/… mówi, Only unified diff (-uNr) format is acceptable.ale kiedy próbuję git diff -uNr tag1..tag2 > mypatch.patch, otrzymuję wiadomośćusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Aaron Franke
2
Uważaj git diff ...+ git apply ...nie obsługuj poprawnie usuniętych / przeniesionych plików ... kiedy git format-patch ...+ git am ...to zrobisz.
vrince
50

Aby stworzyć łatkę na kilka zatwierdzeń, powinieneś użyć format-patchpolecenia git, np

git format-patch -k --stdout R1..R2

Spowoduje to wyeksportowanie zatwierdzeń do pliku poprawki w formacie skrzynki pocztowej.

Aby wygenerować poprawkę dla ostatniego zatwierdzenia, uruchom:

git format-patch -k --stdout HEAD^

Następnie w innym repozytorium zaaplikuj łatkę ampoleceniem git np

git am -3 -k file.patch

Zobacz: man git-format-patchi git-am.

kenorb
źródło
1
A co z łatką, którą można nałożyć patch -p1? sourceware.org/glibc/wiki/…
Aaron Franke
Przenosiłem łatkę z linuxa na winodws, więc musiałem użyć --ignore-whitespace, jak wspomniano tutaj stackoverflow.com/questions/13190679/ ...
Mahesh
2
@AaronFranke, możesz wypróbować opcję '-p': git format-patch -p HEAD ^ 1
Piroxiljin
Warto zauważyć, że ma to tę zaletę, że zachowuje komunikaty o zmianach, autora i daty zatwierdzenia oryginalnych zatwierdzeń.
M. Justin
0

Jako uzupełnienie, aby stworzyć łatkę tylko dla jednego konkretnego zatwierdzenia, użyj:

git format-patch -1 <sha>

Po wygenerowaniu pliku poprawki upewnij się, że inne repozytorium wie, gdzie jest, gdy używasz git am ${patch-name}

Przed dodaniem poprawki użyj, git apply --check ${patch-name}aby upewnić się, że nie ma konfliktu.

Eugene
źródło