No dobra wszyscy wiemy, że GIT jest fajny i wogóle, a w firmie musimy korzystać z SVN. SVN ma swoje zalety, ale wśród nich na pewno brak możliwości lokalnych commitów, brak wygodnego branchowania, czy stashingu(odkładania zmian na później bez commitowania).
GIT SVN
O tym dowiedziałem się stosunkowo niedawno, ale gita można wykorzystać jako klienta subversion. Zasada pracy wygląda tak:
- Wyciągamy kod z repozytorium:
git svn clone
- Pracujemy tak jakbyśmy używali GITa i nie musimy się przejmować ograniczeniami ? czyli możemy poszaleć z branchami, stashami itp.
- Możemy normalnie commitować do lokalnego repo przy pomocy
git commit
- Wrzucamy zmiany do zdalnego repo poprzez
git svn dcommit
git svn clone
Pełna składnia powinna wyglądać mniejwięcej tak:
git svn clone http://example.com/svn -T trunk -b branches -t tags
Przy założeniu że nasze repozytorium zawiera klasyczny podział – w głównym folderze jest branches, tags i trunk.
Gdzie to działa
Na pewno działa to oczywiście w linii komend oraz w TortoiseGit, niestety GitExtensions na razie nie obsługuje svn. Swoje testy przeprowadzałem na maszynie windowsowej. Git svn nie zadziałał gdy miałem lokalne repo(w folderze) utworzone poprzez TortoiseSVN: nie pasował mu wtedy filesystem (używałem BDB).
Bartek Szafko ? GIT jako klient SVN…
Dziękujemy za publikację – Trackback z dotnetomaniak.pl…
Nie wiedziałem o tym. Dzięki, przyda się 🙂
Ciekawe czy można pracować korzystając z Git’a i SVN’a równocześnie mieszająć korzystanie z GitExtensions, TortoiseSVN i ew. AnkhSVN.
Ktoś próbował?
Ewentualnie czy da się korzystać Git’a (GitExtensions lub command line) lokalnie a do firmowego SVN’a wrzucać np. TortoisSVN’em (albo AnkSVN)??
Inna kwestia to rozwiązywanie konfliktów kiedy commit’ujesz do SVN’a (poleceniem “git svn dcommit”).
Lub ten sam problem gdy robisz clone (tzw. SVN’owy update) z SVN’a.
Ma ktoś doświadczenia?
Nie chcę “rozwalić” firmowego SVN’a, a przyznam, że boję się, bo nawet zwykły TortoiseSVN ma często problemy ze sobą, więc wybrażam sobie, że jak dojdzie nad SVN’em kolejna warstwa “Bóg wie jak (nie)kompatybilna” to będzie dopiero jazda.
Aaaa, no i oczywiście problemy pewnie powstają gdy zrobi się rename/move pliku lub katalogu w Git lub SVN.
niestety mieszać się nie da – jeśli masz lokalne repo gita to musisz używać gita, tak samo jak nie możesz użyć tortoisesvn dla kopii lokalnej wyciągniętej z cvs.
szczerze mowiąc nie testowałem co by się stało z konfliktami – może spróbujesz?
możesz uzyć lokalnej kopii svn stworzonej przy pomocy svnsync i przetestować wszystkie scenariusze o których piszesz.
a jeśli chodzi o mergowanie branchy to polecam svnmerge
To jest bardzo wygodne rozwiązanie, stosowałem je do jednego projektu. Jedynym problemem był brak dobrze rozwiązanych externali.
Jeśli struktura repozytorium SVN jest klasyczna (trank, branches, tags) to zamiast
git svn clone http://example.com/svn -T trunk -b branches -t tags
możemy użyć krótszego zapisu
git svn clone http://example.com/svn –stdlayout
lub nawet
git svn clone http://example.com/svn -s