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.