2009-03-18 11 views
47

Mam swoje projekty w 2 repozytoriach. Jeden pod SVN, a drugi pod Git. Ilekroć zmieniam coś w SVN, chcę zrobić to samo w repozytorium Git.Jak zastosować SVN diff do Git?

Powiedz, że dokonuję zmiany w repozytorium SVN, tworząc wersję 125. W jaki sposób zastosować te same zmiany do mojego repozytorium Git (zakładając, że moje repozytorium Git jest aktualne z wersją 124).

Dziękuję.

Odpowiedz

46

Co ja faktycznie/poszukuje było:

cd /path/to/svn/repo 
svn diff -r 125 > /tmp/patch.diff 
cd /path/to/git/repo 
patch -p0 < /tmp/patch.diff 
+1

to nie działa tak dobrze! –

+1

Przepraszamy, to była naprawdę specyficzna sytuacja. Proponuję zadać pytanie, jeśli masz problemy :( – drozzy

+1

Ogólnie git-svn jest lepszym sposobem importowania (i wywozu) svn zobowiązuje do repozytorium git. Będzie ona zachować wiadomości i informacje o autorze popełnienia, oraz radzenia sobie z wieloma przypadki brzegowe który złamie daną odpowiedź tutaj. (oczywiście, ten skrypt może być bardziej odpowiednie dla danej sytuacji, czy istnieją zewnętrzne ograniczenia nie zostały omówione tutaj) – Rich

18

Spróbuj:

svn diff | patch -d /path/to/git/repo -p0 

Zobacz svn help diff jeśli chcesz wyeksportować diff określonej wersji za.

+1

Dlaczego nie ta praca z -p0 zostaje przerwane? –

+0

Zobacz -pnum w http://linux.die.net/man/1/patch W szczególności szukaj na stronie dla słów "nie określając -p". Myślę, że jeśli tego nie określisz - patch zignoruje ścieżkę do pliku i po prostu użyje nazwy pliku. – drozzy

2

Poza tym przy użyciu patcha jak wspomniano powyżej Można też rozważyć utworzenie post-commit hook więc nie trzeba robić to za każdym razem, gdy popełnienia czegoś nowego.

5

Dlaczego nikt nie lubi git-svn? Nie mogę zakładać, że nikt o tym nie wie.

Istnieje git-svn (oraz git-hg i git-cvs oraz git-bzr afaict). Przynajmniej z git-svn można po prostu zrobić

git svn clone --stdlayout http://myrepo/root here 

wykorzystujące -s (--stdlayout) zakłada standardową trunk/oddziały/tagi/układ, ale można mieć to żadnego kędy (man git-svn).

Mapowanie jest dwukierunkowe, więc możesz naciskać i ciągnąć, jak w przypadku natywnego pilota (git). Brak pytań.

+0

krępuj się dodać ofertę post-commit do zrobienia automatycznego impuls po popełnić :) – sehe

+0

To nie robi nie działa dla mnie z svn-git na Windowsie, ponieważ 'git apply' nie działa poprawnie, ponieważ nie może poprawnie analizować względnych ścieżek różnic w stylu svn. –

+1

@the_mandrill erm ... użyj 'patch -p1' (lub -p0, czy cokolwiek to jest potrzebne do stripowania) ?. Zaczekaj. Oooold pytanie. Chodzi o to, że nie potrzebujesz różnic w stylu svn. 'Git wiśniowego pick' – sehe

0

Poniższy działał dla mnie.

Źródło: How to create and apply a patch with Git

pierwsze, przyjrzeć się, jakie zmiany w patch. Można to zrobić łatwo z git zastosować

git apply --stat fix_empty_poster.patch 

pamiętać, że ta komenda NIE zastosować poprawkę, ale tylko pokazuje statystyki o tym, co zrobi. Po przejrzeniu pliku łatki za pomocą ulubionego edytora, możesz zobaczyć, jakie są faktyczne zmiany.

Następnie, interesuje Cię, jak kłopotliwa będzie łatka. Git pozwala przetestować poprawkę przed jej zastosowaniem.

git apply --check fix_empty_poster.patch 

Jeśli nie otrzymuję żadnych błędów, plaster może być nałożona. W przeciwnym razie możesz zobaczyć, jakie kłopoty napotkasz.

Aby zastosować poprawkę, użyję polecenia git am zamiast git. Powodem tego jest to, że git am pozwala na podpisanie się za nałożoną łatką. Może to być przydatne do późniejszego wykorzystania.

git am --signoff < fix_empty_poster.patch 

Applying: Added specs to test empty poster URL behaviour 
Applying: Added poster URL as part of cli output 

OK, łatki zostały zastosowane w sposób czysty, a twój oddział główny został zaktualizowany. Oczywiście, przeprowadź testy ponownie, aby się upewnić, że nic się nie zepsuło.

W zalogować git, przekonasz się, że komunikaty popełniają zawierać „Signed-off-by” tag. Ten znacznik zostanie odczytany przez Githuba i inne osoby, aby dostarczyć użytecznych informacji o tym, w jaki sposób zatwierdzenie zakończyło się w kodzie.

4

Jeśli idziesz do generowania patcha w SVN i stosować go z Git później, nie zapomnij użyć --git command-line option:

--git

włącza specjalny tryb wyjściowy dla svn diff zaprojektowanego dla kompatybilności krzyżowej z popularnym systemem kontroli wersji rozproszonej Git: .

Na przykład uruchomić

svn diff --git -r 125 > /tmp/patch.diff

+0

svn: nieprawidłowa opcja: --git – sloven

+0

@Nik Domyślam się, że twój klient svn jest za stary. Jaki jest rezultat svn --version? – bahrep

+0

svn version 1.6.13 – sloven