2010-07-05 5 views
30

znajdę ten sposób łatwiejszy do łączenia oddziałów i mniej konfliktów:Wezwanie do Subversion?

Copy kufer do nowego oddziału, połączenie go z funkcją oddział/s. Kiedy wszystko ułoży się, połącz nową gałąź z powrotem z bagażnikiem. Ta technika jest podobna do rebiury rtęci i git.

Zwykłem scalać dowolnych changów z pnia do branche/s. Ale później, kiedy połączyłem gałąź funkcji z powrotem do pnia, niektóre rzeczy z pnia zostałyby ponownie połączone z pniem, co spowodowało wiele konfliktów. Istnieje możliwość ponownego scalenia, ale nie sprawdziło się to dla mnie.

Czy ktoś ma podobne przebijanie subversion? Właśnie zacząłem robić to ostatnio i nie widziałem żadnych efektów ubocznych. Czy spowodowałoby to nieprzewidziane problemy?

+0

Jestem vcs noob. Jestem ciekawy: jakie to byłyby konflikty? Jeśli połączenie trunk @ r1 do trunk @ r2 w gałąź i połączenie wyniku z powrotem do trunk, to nie powinno być żadnych zmian z powodu trunk. Czy możesz dać przykład? –

+0

To, co sugerujesz w swoim pytaniu, to właściwe rozwiązanie ;-) Powinno działać zgodnie z oczekiwaniami, nie widzę żadnych skutków ubocznych. – ymajoros

Odpowiedz

0

Używam tego podejścia:

Z przebazowania trzeba uważać, aby nie podjąć rebased korekt nad kiedy ponownie połączyć. Jeśli chodzi o łączenie, wybierz zbiór: wybierz tylko wersje w gałęzi operacji, które implementują coś nowego, a nie zestawienia zmian. To powinno działać dobrze. KOMENTARZ: Nigdy nie pamiętam, żebym użył reintegrowanej gałęzi do czegoś. Myślę, że jest przeznaczony do bardzo prostych przypadków użycia.

W nowym podejściu z opisu nie wynika jasno, w jaki sposób można obsługiwać przekierowanie z linii głównej do gałęzi funkcji, jeśli zajdzie taka potrzeba. Czy chcesz całkowicie zabronić zmiany nazwy? Ponieważ rozgałęzienie w svn jest tanią operacją, może to być również opcja.

+1

poniżej jest moja procedura: 1. trunk-> f1, f2 (gałęzie funkcji) 2. kiedy f1, f2 wykonane, trunk-> wersja gałęzi (do integracji) 3. połączenie f1, f2 do gałęzi wersji (VB) 4. test VB; scalaj poprawki od f1, f2 do VB; wykonaj krótki krok, w przeciwnym razie powtórz 2 do 3 5. po wykonaniu VB połącz je z pniem i zwolnij. –

7

Żałuję, że nie miałem mądrej sztuczki, aby powiedzieć ci, jak osiągnąć zmianę w SVN, ale zawsze unikałem ręcznego odświeżania gałęzi z zmianami bagażnika w SVN, głównie z powodu komplikacji wymagających manualnego wybierania wiśni, o którym wspomina jdehaan.

Zamiast tego na ogół postępuję zgodnie z praktyką łączenia zmian z gałęzi do pnia, usuwania gałęzi, a następnie ponownego tworzenia gałęzi z pnia. To pozwala mi odświeżać/rebase mojej gałęzi funkcji, ale z niefortunnym efektem ubocznym, że wszelkie wcześniejsze zmiany z tej gałęzi są teraz częścią pnia. Z tego powodu stosuję się tylko do tej praktyki, gdy gałąź z funkcjami znajduje się w stabilnym i użytecznym miejscu, ale nadal chcę kontynuować pracę nad tą funkcją, aby dalej realizować jakiś większy cel.

Co wolałabym, aby odświeżenie gałęzi poprzez połączenie zmian pnia z powrotem w gałąź nie spowodowało późniejszej reintegracji scalającej się z tą gałęzią, aby pobrać te odnowione rewizje podczas procesu. Powinno to być możliwe w oparciu o właściwości merge-info, ale zgodnie z tym, co stwierdza jdehaan, a czego się obawiałem, to nadal wymaga to zbioru wiśni.

Należy pamiętać, że przy prawidłowym wdrożeniu przekładania należy również uwzględnić przykłady klatek schodowych, w których oddział jest wykonany z innego oddziału.

Aktualizacja: Zgodnie z dokumentacją Subversion wydaje się, że podczas korzystania z --reintegrate option że Subversion powinno być w stanie odpowiednio zintegrować prace w oddziale w taki sposób, że umysły ewentualne scala odświeżania, które mogły zostać zrobione, aby doprowadzić bazę zmiany w gałęzi. Oczywiście jest to technicznie trochę inne niż przerzucanie, ale uważam, że jest wystarczająco podobny w użyciu, że można go nazwać przebieraniem.

+1

Musisz użyć * - reintegrate * przy scalaniu upstream w subversion. To wszystko pojawiło się w svn 1.5 scalając śledzenie i scalając * możliwe * w porównaniu ze starymi problemami śledzenia, które zestawy zmian zostały już włączone do oddziału. Jest to wciąż dość prymitywna implementacja w porównaniu z tym, co oferuje hg/git, a właściwie nie jest częścią procesu przekwalifikowania. To więcej, gdy skończysz z funkcją lub gałęzią wydania. – quickshiftin

4

W mojej firmie używamy następujące podejście:

  1. dla każdego zadania NK $ X w trackerze emisyjnej mamy oddzielne gałąź/NK $ X
  2. zaczniemy pracę nad zadaniem przez svn cp trunk branches/NK- $ X
  3. nigdy nie dokonujemy zmian bezpośrednio na bagażniku. Dla każdej zaktualizowanej aktualizacji UPDNK-$ X mamy oddzielne oddziały/UPDNK- $ X. Tworzymy go za pomocą gałęzi gałęzi svn cp/UPDNK- $ X tuż przed aktualizacją.
  4. kiedy zadanie NK- $ X jest zaplanowane dla aktualizacji UPDNK- $ Y łączymy oddziały/NK-$ X inot UPDNK-$ Y. To jest cd UPDNK- $ Y; svn merge -r start: gałęzie HEAD/NK- $ X
  5. po UPDNK-$ Y jest gotowy, łączymy go z pnia. To jest trunk cd, svn merge -r start: gałęzie HEAD/UPDNK-$ Y

Jeśli zdarzy się, że zadanie NK-X trwa dłużej niż jeden cykl iteracji, a zatem wymaga odświeżenia, nigdy, przenigdy, NIGDY nie łącz pasma do NK-X. Mamy zasadę, że oddajesz swojej gałęzi tylko te rzeczy, które sam napisałeś, co czyni wszystko łatwiejszym. Zamiast tego możemy zrobić:

cd NK-$X 
svn log 
//let L = the number of the last changeset to this branch changeset 
//let F = the number of the first changeset to this branch 
svn rm branches/NK-$X 
svn cp trunk branches/NK-$X 
svn up 
svn merge -r F:L branches/[email protected] 
svn ci -m 'refereshed' 

ten sposób, gdy spojrzeć na changelog oddziałów/NK $ X widać jedynie zmiany faktycznie wykonywany przez dewelopera.

Aktualizacja: Ponieważ powyżej workflow można zautomatyzować, zacząłem projekt na github: svn rebase.

17

Ogólnie rzecz biorąc, ponowne wprowadzanie zmian jest aktem włączania zmian w górę do gałęzi elementów, przed scaleniem gałęzi funkcji z powrotem do gałęzi nadrzędnej.

W git proces jest jeszcze bardziej wyrafinowany, ponieważ zmiany wprowadzone od utworzenia gałęzi są najpierw usuwane i buforowane, stosowane są zmiany w górę, a następnie stosowane są zmiany buforowane. Na wynos tutaj jest połączenie pnia w gałąź funkcji nie jest rebase w git terms, jest coś więcej. Podejście git ma wiele zalet, ale nie może być zaimplementowane bardzo czysto w svn, ponieważ wszystkie zatwierdzenia muszą być przechowywane na serwerze (svn nie jest rozprowadzany), jednak może być wykonane w svn.

za 'svn rebase' (sposób git) może wyglądać tak

  1. svn cp trunk feature
  2. zobowiązuje do funkcji & bagażniku
  3. svn cp trunk feature-rebase
  4. svn co feature-rebase
  5. cd feature-rebase
  6. svn merge feature
  7. svn commit
  8. svn rm feature
  9. svn mv feature-rebase feature
  10. (z powrotem na funkcje zmieniają bazę WC) svn switch feature

Wtedy ostatecznie na kopii roboczej bagażniku, svn merge --reintegrate feature

Widać różnicę po prostu łączenie magistrali do gałęzi funkcji? Zaczynasz od najnowszego z tego samego portu, w tym przykładzie, a następnie scalasz zmiany z funkcją na to.

Wyobraź sobie, że niektóre z załączników na bagażniku mogą pochodzić z połączenia innej gałęzi funkcji w kierunku bagażnika, więc w ogóle nie sugeruję, aby zobowiązać się bezpośrednio do bagażnika.

+3

Od jakiegoś czasu zaciągam się nogami, ale postanowiłem zamieścić [artykuł] (http://quickshiftin.com/blog/2013/09/svn-rebase-git-way/) na temat dokładne wyjaśnienie. – quickshiftin