Jedną z cech systemów kontroli wersji jest możliwość wyodrębnienia zmian do osobnej linii rozwoju. Linia ta jest znana jako gałąź. Gałęzie są często używane do wypróbowania nowych funkcji bez naruszania głównej linii rozwojowej z błędami kompilacji i algorytmu. Jak tylko nowa funkcja jest wystarczająco stabilna, to gałąź rozwojowa jest scalana na powrót do głównej gałęzi (trunk).
Inną cechą systemów kontroli wersji jest możliwość oznaczania poszczególnych wersji (np. wersji wydanych), dzięki czemu można w każdej chwili odtworzyć niektórych kompilacji lub środowiska. Proces ten jest znany jako etykietowanie.
Subversion nie posiada specjalnych poleceń do rozgałęzienia lub etykietowania, ale używa zamiast tego tzw „tanich kopii”. Tanie kopie są podobne do twardych linków w systemie Unix, co oznacza, że zamiast tworzenia pełnej kopii w repozytorium, tworzony jest wewnętrzny link, wskazując na konkretne drzewo/wersję. W wyniku gałęzie i etykiety są bardzo szybko tworzone i nie zajmują prawie żadnego dodatkowego miejsca w repozytorium.
Jeśli projekt został zaimportowany do zalecanej struktury katalogów, utworzenie wersji gałęzi lub etykiety jest bardzo proste:
Wybierzcie folder, w kopii roboczej, który chcesz skopiować do gałęzi lub etykiety, a następnie wybierzcie polecenie → .
Docelowym domyślnym adresem URL dla nowej gałęzi będzie URL źródła, na którym jest oparta kopia robocza. Będziecie musieli edytować ten adres URL do nowej ścieżki dla gałęzi/etykiety. Stąd zamiast
http://svn.collab.net/repos/ProjectName/trunk
zechcecie raczej teraz użyć czegoś takiego
http://svn.collab.net/repos/ProjectName/tags/Release_1.10
Jeśli nie pamiętacie konwencji nazewnictwa użytej ostatnio, kliknijcie przycisk po prawej stronie, aby otworzyć przeglądarkę repozytorium, dzięki czemu można wyświetlić istniejącą strukturę repozytorium.
Po wskazaniu docelowego URL, wszystkie foldery muszą w nim już istnieć, w przeciwnym razie wyświetli się komunikat błedu. W powyższym przykładzie musi istnieć URL http://svn.collab.net/repos/ProjectName/tags/
by utworzyć tetykietęag Release_1.10
.
Jednak jeśli chcecie utworzyć gałąź/etykietę dla adresu URL posiadającego nie istniejące jeszcze foldery pośrednie , możecie zaznaczyć opcję Utwórz foldery pośrednie
na dole okna. Gdy opcja jest zaznaczona, wszystkie foldery pośrednie zostaną automatycznie utworzone.
Należy zauważyć, opcja ta jest domyślnie wyłączona by uniknąć literówek. Na przykład, jeśli wpisano docelowy URL http://svn.collab.net/repos/ProjectName/Tags/Release_1.10
zamiast http://svn.collab.net/repos/ProjectName/tags/Release_1.10
, wystąpi błąd przy wyłączonej opcji, natomiast przy opcji zaznaczonej zostanie automatycznie utworzony folder Tags
, i skończy się to na istnieniu dwóch folderów Tags
i tags
.
Teraz musicie wybrać źródło kopii. Są dostępne trzy opcje:
Nowa gałąź jest kopiowana bezpośrednio w repozytorium z wersji HEAD. Nie trzeba danych przenosić danych z kopii roboczej, a gałąź zostaje utworzona bardzo szybko.
Nowa gałąź jest kopiowana bezpośrednio w repozytorium, ale można wybrać starszą wersję. Jest to przydatne, jeśli zapomnieliście zrobić etykietę kiedy wydawaliście swój projekt w ubiegłym tygodniu. Jeśli nie pamiętacie numeru wersji, kliknijcie przycisk po prawej stronie, aby wyświetlić dziennik zmian, a następnie wybierzcie stamtąd numer wersji. Znowu dane nie są przesyłane z kopii roboczej, a gałąź stworzy się bardzo szybko.
Nowa gałąź jest identyczną kopią lokalnej kopii roboczej. Jeśli zaktualizowaliście pliki do starszej wersji w KR, lub w przypadku dokonania lokalnych zmian, dokładnie to trafia do kopii. Oczywiście tego rodzaju skomplikowana etykieta może powodować przesyłanie danych z KR do repozytorium, jeśli jeszcze ich tam nie ma.
Jeśli chcecie, aby kopia robocza była przełączona do nowo utworzonej gałęzi automatycznie, użyjcie pola wyboru Przełącz kopię roboczą na nową gałąź/etykietę. Ale jeśli to zrobicie, upewnijcie się najpierw, że kopia robocza nie zawiera zmian. Jeśli tak, to zmiany te zostaną połączone do gałęzi KR po przełączeniu.
Jeśli kopia robocza posiada inne projekty ujęte w atrybutach svn:externals
, te zewnętrzne będą wypisane na dole okna dialogowego gałęzi/etykiety. Dla każdego zewnętrznego pokazana jest ścieżka docelowa i URL źródła.
Jeśli chcecie upewnić się, że nowa etykieta zawsze jest w stanie spójnym, sprawdźcie czy wszystkie zewnętrzne mają przypięte. Jeśli nie sprawdzicie zewnętrznych i te zewnętrzne wskazują na wersję HEAD, która może się zmienić w przyszłości, podczas pobierania nowej etykiety nastąpi pobranie wersji HEAD zewnętrznych i etykieta może się już nie skompilować. Więc to jest zawsze dobry pomysł, aby ustawić zewnętrzne na ustaloną wersję podczas tworzenia etykiety.
Zewnętrzne są zawsze przypinane do ich bieżącej wersji HEAD lub wersji BASE kopii roboczej, zależnie od źródła gałęzi/etykiety:
Tabela 4.1. Przypięta Wersja
Źródło Kopii | Przypięta Wersja |
---|---|
Wersja HEAD w repozytorium | wersja HEAD repozytorium zewnętrznego |
Określona wersja w repozytorium | wersja HEAD repozytorium zewnętrznego |
Kopia robocza | wersja BASE kopii roboczej zewnętrznego |
Jeśli projekt zawarty jako zewnętrzny sam również zawierał zewnętrzne, to one nie zostaną zaetykietowane! Tylko zewnętrzne które są bezpośrednim potomkiem mogą być etykietowane.
Naciśnijcie wewnątrz repozytorium.
by zatwierdzić nową kopię do repozytorium. Nie zapomnijcie wpisać opisu zmian. Należy pamiętać, że kopia jest tworzonaPamiętajcie, że jeśli zdecydowaliście się przełączyć swoją kopię roboczą do nowo utworzonej gałęzi, tworzenie gałęzi lub etykiety nie ma wpływu na kopię roboczą. Nawet po utworzeniu gałęzi z KR, zmiany te są zatwierdzane do nowej gałęzi, nie do linii głównej, więc KR może być jeszcze oznaczone jako zmodyfikowane w stosunku do linii głównej.
Można również utworzyć gałąź lub etykietę bez kopii roboczej. Aby to zrobić, otwórzcie przeglądarkę repozytorium. Można tam przeciągnąć foldery w nowe miejsce. Musicie przytrzymać klawisz Ctrl podczas przeciągania, aby utworzyć kopię, w przeciwnym wypadku folder zostanie przeniesiony, a nie skopiowany.
Można też przeciągnąć folder prawym przyciskiem myszy. Po zwolnieniu przycisku myszy można wybrać z menu kontekstowego, czy należy go przenieść czy skopiować. Oczywiście, aby utworzyć gałąź lub etykietę należy skopiować folder, a nie przesuwać.
Jeszcze innym sposobem jest użycie okna dziennika. Możecie pokazać okno dziennika do np. linii głównej, wybierzcie wersję (wersję HEAD na samej górze albo starszą wersję), kliknijcie prawym przyciskiem myszy i wybierzcie
....oto jest (nie do końca) pytanie. Podczas pobierania wczytywana całość gałęzi z repozytorium do folderu roboczego,
→ przekazuje tylko zmienione dane do kopii roboczej. Lepiej dla obciążenia sieci, lepiej dla cierpliwości. :-)Aby móc pracować ze świeżo wygenerowaną gałęzią lub etykietą macie kilka sposobów, aby sobie z tym poradzić. Można:
→ aby wykonać świeże pobranie w pustym folderze. Możecie, jak chcecie, pobrać do dowolnej lokalizacji na dysku lokalnym i utworzyć dowolną liczbę kopii roboczych z repozytorium.
Przełącie bieżącą kopię roboczą do nowo utworzonej kopii w repozytorium. Ponownie zaznaczcie folder najwyższego poziomu projektu i użyjcie
→ z menu kontekstowego.W następnym oknie dialogowym wpiszcie adres URL gałęzi, którą właśnie utworzyliście. Wybierzcie Wersja HEAD, a następnie przycisk na . Kopia robocza jest przełączona do nowej gałęzi/etykiety.
Przełączenie działa jak aktualizacja, bo nigdy nie odrzuca zmian lokalnych. Wszelkie zmiany wprowadzone do kopii roboczej, które jeszcze nie zostały zatwierdzone zostaną scalone, gdy przełączacie. Jeśli nie chcecie, aby tak się stało, musicie albo zatwierdzić zmiany przed przełączeniem albo przywrócić kopię roboczą do wersji już zatwierdzonej (zazwyczaj HEAD).
Jeśli chcecie pracować na linii głównej i gałęzi, ale nie kosztem świeżego pobrania, możecie użyć eksploratora Windows, aby wykonać kopię pobrania linii głównej w innym folderze, a następnie
→ kopiuje do swojej nowej gałęzi.
Chociaż Subversion się nie czyni rozróżnienia pomiędzy etykietami i gałęziami, sposób w jaki są zwykle używane różni się trochę.
Etykiety są zazwyczaj wykorzystywane do tworzenia statycznego obrazu projektu na określonym etapie. Jako takie nie są zwykle używane dla rozwoju - to gałęzie są od tego. Jest to powodem zalecenia struktury repozytorium /trunk /branches /tags
w pierwszej kolejności. Praca na wersji etykiety nie jest dobrym pomysłem, ale ponieważ lokalne pliki nie są zabezpieczone przed zapisem nie ma nic, aby powstrzymać Was przed pomyłką. Jednakże, jeśli spróbujecie zatwierdzić coś na ścieżce w repozytorium, która zawiera /tags/
, TortoiseSVN wyświetli ostrzeżenie.
Być może trzeba wprowadzić dalsze zmiany do wydania które już zaetykietowaliście. Poprawny sposób obsługi jest taki, aby utworzyć najpierw nową gałąź z etykiety i zatwierdzać na gałęzi. Wykonajcie zmiany na tej gałęzi, a następnie utwórzcie nową etykietę z tej nowej gałęzi, np. Version_1.0.1
.
Jeśli zmodyfikowaliście kopię roboczą utworzoną z gałęzi i zatwierdziliście, to następnie wszystkie zmiany przechodzą do nowej gałęzi a nie linii głównej. Tylko zmiany są przechowywane. Reszta pozostaje tanią kopią.