2010-03-29 11 views
5

Mój zespół używa SVN do kontroli źródła. Ostatnio pracuję nad oddziałem, w którym sporadycznie znika z pnia i jest to dość denerwujące doświadczenie (por. Joel Spolsky's "Subversion Story #1"), więc szukałem alternatywnych sposobów zarządzania oddziałami i łączeniem. Biorąc pod uwagę, że scentralizowane repozytorium SVN nie podlega negocjacjom, chciałbym mieć zestaw narzędzi spełniających następujące warunki.Narzędzia do utrzymywania oddziałów w SVN

  1. Pełna historia zmian powinna być przechowywana w SVN dla obu linii i gałęzi.

  2. Połączenie w dowolnym kierunku (i potencjalnie krzyżowanie) powinno być stosunkowo bezbolesne.

  3. Scalanie historii powinno być przechowywane w SVN w największym możliwym stopniu.

Szukałem zarówno git-svn i bzr-svn i nie wydaje się do pracy — Zasadniczo, biorąc pod uwagę historię zmian można je wyeksportować z repozytorium SVN, mogą one nie wydają się zrobić żadnego Lepszy przetwarzanie zadań scala się z wersją SVN. Na przykład po sklonowaniu repozytorium przy użyciu git, historia wersji dla mojego oddziału pokazuje oryginalną gałąź z pnia, ale git nie "widzi" żadnego z przejściowych SVN łączy się jako "natywny" scala — historia wersji jest jedna długa linia. W rezultacie każda próba połączenia z pnia w git przyniosła tyle samo konfliktów co połączenie SVN. (Poza tym, git-svn documentation wyraźnie ostrzega przed użyciem git scalić między oddziałami.)

Czy istnieje sposób, aby dostosować mój workflow aby git spełniać powyższe wymagania? Może po prostu potrzebuję wskazówek lub trików (lub osobnego narzędzia do łączenia?), Aby pomóc SVN być lepszym w łączeniu się w gałęzie?

+0

Wygląda na to, że musisz po prostu przekonać swój zespół do korzystania z git. : P – Amber

+2

Myślę, że niestety, masz do czynienia z faktem, że SVN ma ograniczoną zdolność do łączenia oddziałów - i tak długo, jak twoje centralne repozytorium jest repozytorium SVN, trudno jest uzyskać dowolną ilość magii git ocalić Cię. Jestem z pewnością ciekawy, czy są jakieś dobre działające kludy! – Cascabel

Odpowiedz

2

Bez konieczności czystego SVN odpowiedź, chciałbym odnieść się do kwestii SO „How to fool git-svn to recognize merges made with svn?

Poleciłem robi te git łączy w specjalnym oddziale, ale prostszym rozwiązaniem byłoby nagrywać (przynajmniej najnowszym) SVN łączy w git-svn sklonowanego repo z git grafts file, w celu przekształcenia:

o-...-A---o---D--- unstable 
/  
X-----B---M---o---o--- stable 

do:

o-...-A---o---D--- unstable 
/  \ 
X-----B---M---o---o--- stable 

, łagodzenie procesu scalania git, przed dcommit i wysłanie go z powrotem do SVN.

+0

Plik przeszczepów wydaje się bardzo pomóc, dzięki! Wydaje się, że wystarczy dodać graft do ostatniego scalenia z pnia. Czy to prawda? Czy polecasz użycie 'git merge --squash', aby ukryć prawdziwą wartość DAG od SVN? Zastanawiam się także, jak dobrze to spełnia # 3 (choć szczerze nie jestem pewien, jak cenne jest to, że mergeinfo jest SVN)? –

+0

@Chris: po przeczytaniu http://stackoverflow.com/questions/2427238/in-git-what-is-the-difference-between-merge-squash-and-rebase, nie sądzę, aby 'squge scalić' jest konieczne tutaj. SVN może używać DAG do nagrywania niektórych metadanych 'mergeinfo' podczas' dcommit'. – VonC

Powiązane problemy