Połącz gałąź z pniem


125

Mam szczególny problem z SVN merge. Chcę połączyć się z gałęzi deweloperskiej do głównej. Mamy kilka gałęzi deweloperskich odciętych jednocześnie.

Scalam jedną z tych gałęzi do linii głównej za pomocą tego polecenia:

svn merge trunk branch_1

Widzę zmiany, które nie są częścią tej gałęzi, są scalane w trunk. Co ja robię źle ?

Wersja SVN:

Klient wiersza polecenia Subversion, wersja 1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32.


7
Wiem, że to nie jest odpowiedź, ale jeśli masz kilka aktywnych gałęzi jednocześnie, prawdopodobnie lepiej przenieś się do Mercurial lub Git. Ps: Nie jestem fanatykiem, pracuję z svn ~ 7 lat ;-)
— zerkms

2
Jakie korzyści daje? Dlaczego przejście na Git lub Mercurial to lepszy wybór?
— Vanchinathan Chandrasekaran

3
ponieważ git i mercurial mają znacznie lepsze wsparcie dla gałęzi. Zalety: nie będziesz zadawał takich pytań i będziesz miał mniej bólu głowy przy tworzeniu i utrzymywaniu oddziałów (obecnie pracuję w projekcie z> 1000 oddziałów, w svn było piekło z nimi pracować)
— zerkms

Zalecam zajrzenie do Svnmerge.py i przejrzenie tego artykułu .
— chown

Odpowiedzi:


215

Twoja svn mergeskładnia jest nieprawidłowa.

Chcesz wyewidencjonować kopię roboczą, trunka następnie skorzystać z svn merge --reintegrateopcji:

$ pwd
/home/user/project-trunk

$ svn update  # (make sure the working copy is up to date)
At revision <N>.

$ svn merge --reintegrate ^/project/branches/branch_1
--- Merging differences between repository URLs into '.':
U    foo.c
U    bar.c
 U   .

$ # build, test, verify, ...

$ svn commit -m "Merge branch_1 back into trunk!"
Sending        .
Sending        foo.c
Sending        bar.c
Transmitting file data ..
Committed revision <N+1>.

Więcej informacji można znaleźć w rozdziale książki SVN o scalaniu .


Zwróć uwagę, że w momencie pisania była to właściwa odpowiedź (i została zaakceptowana), ale sprawy potoczyły się dalej. Zobacz odpowiedź topek i http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate


4
- opcja reintegrate nie jest obowiązkowa, gałąź (w wersji 1.6) może być połączona z dowolnym miejscem docelowym dowolną liczbę razy
— Lazy Badger

1
Naprawdę? Bez ryzyka ponownego utworzenia tych samych zestawów zmian? Czy może Pan podać link do potwierdzających tego dowodów?
— Neutrino

--reintegratenie jest rzeczywiście obowiązkowe, ale w tym przypadku naprawdę zalecane. Próbowałem to zrobić bez --reintegratei zakończyłem setkami konfliktów. Bez --reintegratekonfliktów i wszystko było dobrze!
— tibo

17
Ta --reintegrateopcja jest prosta i skuteczna, ALE należy zauważyć, że „Po wykonaniu --reintegratescalenia z gałęzi do pnia gałąź nie nadaje się już do dalszej pracy. Nie jest w stanie poprawnie wchłonąć nowych zmian pnia ani nie można jej poprawnie ponownie zintegrować do bagażnika ”. jak wyjaśniono w książce, do której masz link.
— Pino,

3
@daveL, forward scala z pnia do gałęzi ma dla mnie sens. Jednak znalazłem zaawansowaną funkcję, która „utrzymuje przy życiu ponownie zintegrowaną gałąź” (patrz stackoverflow.com/a/10163059/685806 ), a ponadto jest stosowana automatycznie przez nowsze wersje klienta.
— Pino

78

Jeśli twój katalog roboczy wskazuje na linię główną, powinieneś być w stanie połączyć swoją gałąź z:

svn merge https://HOST/repository/branches/branch_1

pamiętaj, aby wydać to polecenie w katalogu głównym swojego łącza


7
Od SVN 1.8. to jest właściwa odpowiedź. Zobacz subversion.apache.org/docs/release-notes/ ...
— GreenAsJade

@blahdiblah fragment kodu zawiera wiele dodatkowych informacji. Istnieje powód, dla którego streszczenie badań jest odczytywane o rzędy wielkości bardziej niż jakakolwiek inna część badania. To samo dotyczy testów UX, minimalizowania współczynników odrzuceń itp. To ta sama zasada.
— ahnbizcad

w wersji 1.7 można było scalać bez opcji --reintegrate, rozwijać się w gałęzi i kontynuować scalanie. Niestety, 1.8 zmusi to do ponownej integracji i wydaje się, że nie ma sposobu, aby temu zapobiec. Oznacza to, że gdy tylko się połączysz, nie możesz użyć tej gałęzi bez przechodzenia przez przerażający "taniec utrzymania przy życiu"
— John Little

3
Nie zapomnij o wysłaniu kopii roboczej z powrotem do repozytorium po scaleniu!
— John

16

Wykonaj aktualizację svn w bagażniku, zanotuj numer wersji.

Z bagażnika:

svn merge -r<revision where branch was cut>:<revision of trunk> svn://path/to/branch/branchName

Możesz sprawdzić, gdzie gałąź została wycięta z pnia, wykonując dziennik svn

svn log --stop-on-copy

Ponieważ istnieje wiele gałęzi deweloperskich, które działają w tym samym czasie, to również nie działało dla mnie, to polecenie pobierało również zmiany z innych gałęzi. Może to problem z klientem SLik SVN?
— Vanchinathan Chandrasekaran

Chociaż nie jest to niedokładne, istnieją łatwiejsze sposoby na połączenie z nowszymi wersjami svn(takimi jak ta, której używa OP).
— blahdiblah

@VanchinathanChandrasekaran, w poleceniu określasz nazwę gałęzi, ponieważ svn://path/to/branch/branchNamepowinno to pobierać tylko zmiany z tej gałęzi, a nie z innych gałęzi. Jeśli tak, to grozi nam niebezpieczeństwo!
— Fredrick Gauss

1

Składnia jest nieprawidłowa, a powinna być

svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.