svn: zamień trunk na branch


155

Jaki jest najlepszy sposób, aby uczynić jedną z gałęzi repozytorium subversion nowym linkiem?

Nastąpił poważny przepis na cały system: rzeczy zostały przeniesione, przepisane, zastąpione, usunięte, przemianowane itp. Przepisany kod został przetestowany i jest gotowy do zastąpienia starego bagażnika.

Zasadniczo stara główna linia (Trunk 5) jest oznaczona i kończy się tutaj. Przepisana gałąź (Gałąź 6) ma stać się nową linią główną (Pień 7):

Bagażnik (1) -> Bagażnik (2) -> Bagażnik (5) -> × + -> nowy Bagażnik (7)
  \ \ |
  scalać widelec ???
    \ \ |
     + -> Oddział (3) -> Oddział (4) -> Oddział (6) - +

Wszystkie bieżące zmiany ze starego „Pnia” są już włączone do „Przepisanej gałęzi”

W jaki sposób mogę to zrobić?

Odpowiedzi:


118

Użyj svn move, aby przenieść zawartość starego pnia w inne miejsce, a następnie zmień nazwę gałęzi na trunk.

Zauważ, że kopiowanie i przenoszenie w svn działa jak operacje na plikach. Możesz ich używać do przenoszenia / kopiowania rzeczy w swoim repozytorium, a te zmiany są również wersjonowane. Pomyśl o „przeniesieniu” jako „kopiuj + usuń”.

[EDYCJA] Nilbus właśnie powiadomił mnie, że podczas korzystania z programu będą występować konflikty podczas łączenia svn move.

Nadal uważam, że jest to właściwe podejście. Spowoduje to konflikty, ale jeśli scalisz ostrożnie, istnieje szansa, że ​​nie stracisz żadnych danych. Jeśli to ci przeszkadza, użyj lepszego VCS, takiego jak Mercurial lub Git .


1
Jeśli to zrobisz, każdy, kto ma zmiany w kopii roboczej w oryginalnym pniu, będzie miał konflikt, nawet jeśli ich zmiany powinny się scalić. Dzieje się tak, ponieważ pliki są usuwane i ponownie dodawane - są traktowane jako osobne obiekty z osobną historią.
Edward Anderson,

@nilbus: Próbowałeś tego? IIRC, SVN pokazuje, że pliki zostały usunięte i ponownie odczytane, ale wewnętrznie będzie wiedział, że pliki zostały przeniesione.
Aaron Digulla

Tak. Sprawdziłem dwie kopie. W pierwszej kopii przeniosłem dir A do A2 i dir B do A. Następnie przeniosłem A do B, potem A2 do A. (zmiana nazwy i zmiana nazwy z powrotem). W drugim pobraniu dokonałem zmiany w pliku i spróbowałem svn aktualizacja. Wystąpił konflikt, ponieważ plik, który zmieniłem, „został usunięty”. Wewnętrznie nie zapisuje zduplikowanych kopii plików, ale Usunięcie, które widzisz, naprawdę wpływa na ciebie, jeśli chodzi o konflikty.
Edward Anderson,

12
@nilbus: W tym miejscu chciałbym zacytować Linusa Torvaldsa: „Slogan Subversion przez jakiś czas brzmiał:„ CVS zrobione dobrze ”lub coś w tym rodzaju, a jeśli zaczniesz od tego rodzaju sloganu, nigdzie nie możesz idź. Nie ma sposobu na poprawne wykonanie CVS. "
Aaron Digulla

3
tak. Zgodziłbym się. Aby rozwiązać ten problem, faktycznie sprawdziłem repozytorium za pomocą svn-git i użyłem git do ponownego bazowania gałęzi na wzorcu.
Edward Anderson

66

Zgadzam się z użyciem polecenia svn move do osiągnięcia tego celu.

Wiem, że inni uważają to za niezwykłe, ale ja lubię to robić w ten sposób. Kiedy mam gałąź funkcji i jestem gotowy do scalenia go z pniem, który również został znacząco zmodyfikowany, połączę go z nową gałęzią, zwykle o nazwie <FeatureBranchName>-Merged. Następnie rozwiązuję konflikty i testuję scalony kod. Po zakończeniu przenoszę bagażnik do folderu tagów, aby nic nie zgubić. Wreszcie przenoszę <FeatureBranchName>-Mergedsię do bagażnika.

Ponadto wolę unikać kopii roboczej podczas wykonywania ruchów, oto przykłady poleceń:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

Uwaga: używam 1.5


1
Może to nie jest najlepsza praktyka, ale z pewnością jest najbardziej wydajna, gdy masz bardzo stary pień i wszyscy pracowali nad gałęzią tak, jakby to była pień. To rozwiązało mój problem!
Alex Perrin

12

Właśnie ostatnio przyglądałem się temu problemowi i rozwiązaniem, z którego byłem bardzo zadowolony, było działanie

svn merge --ignore-ancestry trunk-url branch-url

na kopii roboczej mojego bagażnika.

Nie jest to próba wprowadzania zmian w sposób historyczny (utrzymanie zmian w pniu). Po prostu „stosuje różnicę” między pniem a gałęzią. Nie spowoduje to żadnych konfliktów dla użytkowników w plikach, które nie zostały zmodyfikowane. Jednak utracisz informacje historyczne z oddziału, ale dzieje się tak, gdy i tak dokonasz scalenia.


1
Po wydaniu svn 1.5 powinieneś być w stanie wykonywać scalenia, które zachowują historię.
NSherwin,

9

Zaleca się wprowadzenie tych zmian za pomocą narzędzia przeglądarki repozytorium.

Próba dużych operacji usuwania i przenoszenia za pośrednictwem kopii roboczej to świetny sposób na zabicie kopii roboczej. Jeśli jesteś zmuszony do używania kopii roboczej, wykonaj zatwierdzanie przyrostowe po każdej operacji usuwania lub przenoszenia i ZAKTUALIZUJ swoją kopię roboczą po każdym zatwierdzeniu.


Link do Repo przydałby się (tylko dla wygody - zapisz wyszukiwanie w Google :))
Brian M. Hunt

3
Przepraszam. Pisownia sprawiała, że ​​wyglądało to tak, jakbym odnosił się do konkretnego narzędzia (edytowanego). W rzeczywistości większość narzędzi GUI SVN powinna mieć funkcję przeglądarki repozytorium. Do Twojej wiadomości: używam żółwia tortoisesvn.tigris.org
Chris Nava

4

Jeśli chcesz, aby gałąź stała się nowym linkiem (tj.) Pozbyła się wszystkich zmian w linii głównej, które zostały wprowadzone od czasu utworzenia gałęzi, możesz: 1. Utworzyć gałąź linii głównej (do celów kopii zapasowej) 2. "cofnąć zmiany "na linii głównej (wybierz wszystkie wersje po utworzeniu gałęzi 3. Scal gałąź z powrotem do linii głównej.

Historia powinna tak pozostać.

Pozdrawiam, Roger


3

Rozwiązania @Aaron Digulla i @kementeus są wykonalne. W przypadku repozytoriów Subversion 1.4 operacje kopiowania / przenoszenia mogą utrudnić przyszłą migrację do innej struktury repozytoriów lub podział repozytoriów.

Uważam, że ulepszenia 1.5 obejmują lepszą rozdzielczość historii przenoszenia / kopiowania, więc prawdopodobnie nie byłby to problem dla repozytorium 1.5.

W przypadku repozytorium 1.4 zalecałbym użycie svnadmin dumpi svndumpfilterwykonanie przeniesienia istniejącego pnia w inne miejsce, a następnie przeniesienie gałęzi do pnia za pomocą tego samego mechanizmu. Załaduj dwa pliki zrzutu do repozytorium testowego, sprawdź, a następnie przenieś je do środowiska produkcyjnego.

Oczywiście przed rozpoczęciem wykonaj kopię zapasową istniejącego repozytorium.

Pozwala to zachować historię bez jawnego rejestrowania przeniesienia / kopii i ułatwia przyszłą reorganizację, zachowując historię.


Edycja: zgodnie z żądaniem, dokumentacja zachowania 1.4, z książki 1.4 Red-Bean, Filtering Repository History

Również skopiowane ścieżki mogą sprawić trochę problemów. Subversion obsługuje operacje kopiowania w repozytorium, gdzie nowa ścieżka jest tworzona przez kopiowanie już istniejącej ścieżki. Możliwe, że w którymś momencie życia repozytorium mogłeś skopiować plik lub katalog z jakiejś svndumpfilterwykluczającej lokalizacji do lokalizacji, którą on zawiera. Aby dane zrzutu były samowystarczalne,svndumpfiltermusi nadal pokazywać dodanie nowej ścieżki - w tym zawartość wszelkich plików utworzonych przez kopię - i nie reprezentować tego dodatku jako kopii ze źródła, które nie będzie istniało w strumieniu danych z odfiltrowanego zrzutu. Ale ponieważ format zrzutu repozytorium Subversion pokazuje tylko to, co zostało zmienione w każdej wersji, zawartość źródła kopiowania może nie być łatwo dostępna. Jeśli podejrzewasz, że masz jakiekolwiek kopie tego rodzaju w swoim repozytorium, możesz chcieć przemyśleć swój zestaw dołączonych / wykluczonych ścieżek, być może włączając ścieżki, które służyły jako źródła twoich kłopotliwych operacji kopiowania.

Dotyczy to migracji / reorganizacji przy użyciu svndumpfilter. Są chwile, kiedy odrobina dodatkowej pracy teraz może zaoszczędzić wiele dodatkowej pracy później, a dzięki łatwemu wykorzystaniu svndumpfilterdostępnej dla przyszłych migracji / reorganizacji ryzyko zmniejsza się przy stosunkowo niskich kosztach.


Dlaczego „svn move” nie byłby wystarczający? Twoja sugestia wygląda jak zgniecenie muchy młotem.
Rob Williams

Ugryzło mnie to zachowanie 1.4 - jeśli repozytorium SVN zawiera przenoszenie (zmianę nazw) katalogów lub gałęzi / tagów, użycie svndumpfilter do pomocy w reorganizacji / migracji repozytorium do nowej struktury może się nie powieść, ponieważ nie obsługuje historii dobrze. To jest udokumentowane, odkopię ref. jeśli chcesz
Ken Gentle,

Czy możesz dodać odniesienie do tego zachowania?
Jacco,

2

Chociaż powyższe odpowiedzi będą działać, nie są one najlepszą praktyką. Najnowszy serwer svn i ścieżka klienta łączą się dla Ciebie. Więc svn wie, które wersje zostały scalone w gałąź i skąd. To bardzo pomaga w utrzymywaniu aktualności gałęzi, a następnie łączeniu jej z powrotem w pniu.

Bez względu na to, której wersji Subversion używasz, istnieje najlepsza metoda postępowania w celu uzyskania zmian w gałęzi z powrotem do linii głównej. Jest to opisane w podręczniku Subversion: Kontrola wersji z Subversion, rozdział 4. Rozgałęzianie i łączenie, utrzymywanie synchronizacji gałęzi .


Dzięki za oficjalne informacje, abym mógł połączyć oddział z pniem przez oficjalne podejście.
Słowem

-3

To naprawdę dziwna / nietypowa konfiguracja w SVN, nawet jeśli myślę, że wcale nie jest to „dobra praktyka”, i tak myślę, że możesz zrobić coś takiego:

  • Sprawdź wszystkie źródła (svn co therootsourcetree)
  • Usuń bagażnik (svn rm trunk)
  • Skopiuj gałąź do pnia (gałęzie svn cp / thebranch / trunk)
  • Usuń gałąź (gałęzie svn rm / thebranch)
  • Zatwierdź zmiany

Powodzenia


9
To niszczy ślad historii, który zostałby zachowany przez "svn move".
Rob Williams
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.