Czy jest jakiś sposób, aby uzyskać łatkę utworzoną za pomocą git format-patch, aby była kompatybilna z svn, abym mógł przesłać ją do repozytorium svn?
Pracuję nad repozytorium svn na github i chcę przesłać zmiany z powrotem do głównego repozytorium. Aby to zrobić, muszę utworzyć łatkę, jednak łata nie może być zastosowana, ponieważ git formatuje tę łatkę inaczej niż svn. Czy jest jakiś sekret, którego jeszcze nie odkryłem?
AKTUALIZACJA: Chociaż obecnie nie istnieje żaden skrypt ani natywny sposób gita, aby to zrobić, udało mi się znaleźć post z początku tego roku o tym, jak ręcznie to zrobić. Postępowałem zgodnie z instrukcjami i udało mi się uzyskać moje poprawki git do pracy z svn.
Gdyby ktoś mógł spróbować napisać scenariusz, aby to osiągnąć i wnieść wkład w projekt git, każdy byłby bardzo doceniony.
http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308
źródło
Odpowiedzi:
Zawsze muszę to Google, ale sposób, w jaki odkryłem, że działa idealnie (dla mnie), to:
git diff --no-prefix master..branch > somefile.diff
, część główna i rozgałęziona są opcjonalne, w zależności od tego, jak chcesz uzyskać różnice.patch -p0 < somefile.diff
.Zawsze wydaje mi się, że działa dobrze i wydaje się być najprostszą metodą, z jaką się spotkałem.
źródło
--no-pager
nie jest już opcją dlagit diff
.--no-pager
, nie jestem pewien, dlaczego został dodany w edycji. I tak zawsze mi się--no-pager
to udawało.git diff --no-prefix 056a1ba5140 7d939289b80 >my.patch
działało dla mnie (gdzie056a1ba5140
i7d939289b80
są sha-1 poprzedniego i konkretnego zatwierdzenia w git).Krótka odpowiedź brzmi
patch -p1 -i {patch.file}
.Szczegółowe informacje można znaleźć na tym blogu: Tworzenie poprawek Subversion za pomocą git .
źródło
Oto skrypt pomocniczy do tworzenia różnic z najnowszym zestawem zmian svn i podanym zatwierdzeniem: http://www.mail-archive.com/[email protected]/msg00864.html
źródło
git svn info
zamiast tego używał :REV=`git svn info | grep 'Last Changed Rev:' | sed -E 's/^.*: ([[:digit:]]*)/\1/'`
SVN prawdopodobnie nie może zrozumieć wyniku działania
git diff -p
, ale możesz użyć brutalnej siły:diff -r
dwa klony.źródło
git diff --no-prefix > somefile.diff
w swoim repozytorium git i wyślij to do dowolnego użytkownika svn, aby zaaplikował łatkępatch -p0 < somefile.diff
w katalogu głównym projektu.Subversion <1.6 nie obsługuje poprawek. Wygląda na to, że Subversion 1.7 pozwoli na stosowanie łatek, a rozszerzenia git / hg do unified diff znajdują się na naszej liście TODO.
źródło
To rzeczywiście propozycja funkcji na początku 2008 roku
Linus Torvalds powiedział wtedy:
Może dlatego
został wprowadzony w Git1.5.6 w maju / lipcu 2008 (choć nie testowałem)
źródło
Upewnij się, że zmiany zostały zatwierdzone i ponownie oparte na lokalnej gałęzi git, z git bash run:
git show --pretty >> myChangesFile.patch
źródło
Zaakceptowana odpowiedź udzielona przez Nicholasa działa dobrze, z wyjątkiem sytuacji, gdy a) pliki binarne istnieją w diff lub b) pracujesz w systemie Windows Git i masz katalogi ze spacjami. Aby to rozwiązać, musiałem dodać zagnieżdżone polecenie git diff, aby zignorować pliki binarne i polecenie sed, aby uciec ze spacji. Pisanie jest trochę uciążliwe, dlatego utworzyłem alias:
Jeśli następnie wpiszesz:
... zostanie utworzony plik poprawki Feature123.patch z różnicami między bazą scalania gałęzi głównej i gałęzi Feature123.
źródło