Wiele razy widziałem te słowa w dyskusjach na temat Subversion (i chyba ogólne repozytorium).
Używam SVN do moich projektów od kilku lat, ale nigdy nie zrozumiałem pełnej koncepcji tych katalogów.
Co mieli na myśli?
Wiele razy widziałem te słowa w dyskusjach na temat Subversion (i chyba ogólne repozytorium).
Używam SVN do moich projektów od kilku lat, ale nigdy nie zrozumiałem pełnej koncepcji tych katalogów.
Co mieli na myśli?
Odpowiedzi:
Hmm, nie jestem pewien, czy zgadzam się z tym, że Nick ponownie jest podobny do gałęzi. Tag to tylko marker
Trunk byłby głównym elementem rozwoju, poczynając od początku projektu aż do chwili obecnej.
Odgałęzienie będzie kopią kodu pochodzącą z określonego punktu w linii głównej, która jest używana do wprowadzania poważnych zmian w kodzie przy jednoczesnym zachowaniu integralności kodu w linii głównej. Jeśli główne zmiany działają zgodnie z planem, zwykle są one z powrotem łączone z bagażnikiem.
Tag będzie punktem na pniu lub gałęzi, który chcesz zachować. Dwoma głównymi powodami zachowania byłoby to, że albo jest to główna wersja oprogramowania, czy to alfa, beta, RC lub RTM, lub jest to najbardziej stabilny punkt oprogramowania przed zastosowaniem poważnych zmian w magistrali.
W projektach o otwartym kodzie źródłowym główne gałęzie, które nie są przyjmowane do pnia przez interesariuszy projektu, mogą stać się podstawą forks - np. Całkowicie oddzielne projekty o wspólnym pochodzeniu z innym kodem źródłowym.
Poddrzewa gałęzi i znaczników można odróżnić od pnia na następujące sposoby:
Subversion pozwala administratorom systemów tworzyć skrypty przechwytujące, które są uruchamiane w celu wykonania w przypadku wystąpienia określonych zdarzeń; na przykład zatwierdzenie zmiany w repozytorium. Typowa implementacja repozytorium Subversion bardzo często traktuje każdą ścieżkę zawierającą „/ tag /”, która ma być chroniona przed zapisem po utworzeniu; wynikiem netto jest to, że utworzone tagi są niezmienne (przynajmniej dla „zwykłych” użytkowników). Odbywa się to za pośrednictwem skryptów przechwytujących, które wymuszają niezmienność, zapobiegając dalszym zmianom, jeśli znacznik jest węzłem nadrzędnym zmienionego obiektu.
Subversion posiada również funkcje od wersji 1.5, odnoszące się do „śledzenia scalania gałęzi”, dzięki czemu zmiany przypisane do gałęzi mogą zostać ponownie włączone do linii głównej z obsługą przyrostowego, „inteligentnego” scalania.
Tags
katalog jest również często używany do testowania i weryfikacji kamieni milowych przez zwykłego użytkownika. Byłoby to również dobre miejsce na umieszczenie prototypu (tylko kilka pomysłów na mojej głowie).
Po pierwsze, jak zauważają @AndrewFinnell i @KenLiu, w SVN same nazwy katalogów nic nie znaczą - „trunk, gałęzie i znaczniki” są po prostu powszechną konwencją stosowaną przez większość repozytoriów. Nie wszystkie projekty używają wszystkich katalogów (dość często nie używa się w ogóle „znaczników”) i w rzeczywistości nic nie powstrzymuje cię przed nazywaniem ich tak, jak chcesz, chociaż łamanie konwencji jest często mylące.
Opiszę prawdopodobnie najczęstszy scenariusz użycia gałęzi i tagów oraz podam przykładowy scenariusz ich użycia.
Bagażnik : Główny obszar rozwoju. To jest miejsce, w którym znajduje się Twoja kolejna ważna wersja kodu i na ogół ma wszystkie najnowsze funkcje.
Oddziały : Za każdym razem, gdy wydajesz wersję główną, tworzona jest gałąź. Pozwala to na naprawę błędów i wydanie nowej wersji bez konieczności wydawania najnowszych - prawdopodobnie niedokończonych lub nieprzetestowanych - funkcji.
Tagi : za każdym razem, gdy wydajecie wersję (wydanie końcowe, kandydaci do wydania (RC) i bety), tworzycie dla niej tag. To daje ci kopię kodu w momencie, w jakim była w tym stanie, pozwalając ci wrócić i odtworzyć wszelkie błędy w razie potrzeby w poprzedniej wersji lub ponownie wydać poprzednią wersję dokładnie tak, jak była. Gałęzie i znaczniki w SVN są lekkie - na serwerze nie tworzy pełnej kopii plików, tylko znacznik z napisem „te pliki zostały skopiowane w tej wersji”, który zajmuje tylko kilka bajtów. Mając to na uwadze, nigdy nie powinieneś martwić się tworzeniem tagów dla dowolnego wydanego kodu. Jak powiedziałem wcześniej, tagi są często pomijane, a zamiast tego dziennik zmian lub inny dokument wyjaśnia numer wersji po wydaniu.
Załóżmy na przykład, że zaczynasz nowy projekt. Zaczynasz pracować w „pniu”, nad czym ostatecznie zostanie wydana wersja 1.0.
Po zakończeniu 1.0.0 rozgałęziasz pień do nowej gałęzi „1.0” i tworzysz znacznik „1.0.0”. Teraz trwają prace nad tym, co ostatecznie będzie 1.1.
Napotykasz kilka błędów w kodzie, naprawiasz je w bagażniku, a następnie łączysz poprawki z gałęzią 1.0. Możesz także zrobić coś przeciwnego i naprawić błędy w gałęzi 1.0, a następnie scalić je z powrotem do pnia, ale zwykle projekty trzymają się scalania tylko w jedną stronę, aby zmniejszyć szansę na coś pominięcia. Czasami błąd można naprawić tylko w wersji 1.0, ponieważ jest on przestarzały w wersji 1.1. To naprawdę nie ma znaczenia: chcesz się upewnić, że nie wydasz 1.1 z tymi samymi błędami, które zostały naprawione w 1.0.
Gdy znajdziesz wystarczającą liczbę błędów (lub może jeden błąd krytyczny), decydujesz się na wydanie wersji 1.0.1. Stwórz więc tag „1.0.1” z gałęzi 1.0 i zwolnij kod. W tym momencie bagażnik będzie zawierał 1.1, a gałąź „1.0” zawiera kod 1.0.1. Następnym razem, gdy wydasz aktualizację do wersji 1.0, będzie to wersja 1.0.2.
W końcu jesteś prawie gotowy do wydania 1.1, ale najpierw chcesz zrobić wersję beta. W takim przypadku prawdopodobnie utworzysz gałąź „1.1” i tag „1.1beta1”. Teraz praca nad tym, co będzie 1.2 (lub 2.0), jest kontynuowana w pniu, ale praca nad 1.1 trwa w gałęzi „1.1”.
Po wydaniu wersji 1.1 finalnej wykonujesz tag „1.1” z gałęzi „1.1”.
Możesz także nadal utrzymywać 1.0, przenosząc poprawki błędów między wszystkimi trzema gałęziami (1.0, 1.1 i magistralą). Ważne jest to, że dla każdej głównej wersji oprogramowania, którą zarządzasz, masz gałąź, która zawiera najnowszą wersję kodu dla tej wersji.
Inne zastosowanie gałęzi dotyczy funkcji. To tutaj rozgałęziasz pień (lub jedną z gałęzi wydania) i pracujesz nad nową funkcją w izolacji. Po zakończeniu funkcji scalasz ją z powrotem i usuwasz gałąź.
Chodzi o to, gdy pracujesz nad czymś destrukcyjnym (co powstrzymałoby lub przeszkadzałoby innym w wykonywaniu ich pracy), czymś eksperymentalnym (który może nawet tego nie zrobić) lub po prostu czymś, co zajmuje dużo czasu (i obawiasz się, że jeśli utrzymasz wydanie 1.2, gdy będziesz gotowy do rozgałęzienia 1.2 z pnia), możesz to zrobić w oddziale. Zasadniczo aktualizujesz go za pomocą łącza, cały czas łącząc z nim zmiany, co ułatwia ponowną integrację (scalanie z powrotem do łącza) po zakończeniu.
Zauważ też, że schemat wersji, którego tu użyłem, jest tylko jednym z wielu. Niektóre zespoły wprowadzałyby poprawki błędów / wydania konserwacyjne w wersji 1.1, 1.2 itd., A główne zmiany w wersji 1.x, 2.x itd. Wykorzystanie tutaj jest takie samo, ale można nazwać gałąź „1” lub „1 .x ”zamiast„ 1.0 ”lub„ 1.0.x ”. (Poza tym wersja semantyczna jest dobrym przewodnikiem po tym, jak robić numery wersji).
Oprócz tego, co powiedział Nick, możesz dowiedzieć się więcej na stronie Streaming Lines: Wzorce rozgałęziania dla równoległego tworzenia oprogramowania
Na tej figurze main
jest tułów, rel1-maint
gałąź i 1.0
metka.
Ogólnie (widok agnostyczny narzędzia) gałąź jest mechanizmem wykorzystywanym do równoległego programowania. SCM może mieć od 0 do n gałęzi. Subversion ma 0.
Trunk jest główną gałęzią zalecaną przez Subversion , ale nie jesteś w żaden sposób zmuszony do jej utworzenia. Możesz to nazwać „głównym” lub „wydaniami”, albo wcale nie mieć!
Oddział reprezentuje wysiłek rozwojowy. Nigdy nie należy go nazywać po zasobie (jak „vonc_branch”), ale po:
Tag jest migawką plików, aby łatwo wrócić do tego stanu. Problem polega na tym, że znacznik i gałąź są takie same w Subversion . I zdecydowanie poleciłbym podejście paranoiczne:
możesz użyć jednego ze skryptów kontroli dostępu dostarczonych z Subversion, aby nikt nie robił nic poza tworzeniem nowych kopii w obszarze znaczników.
Tag jest ostateczny. Jego treść nigdy nie powinna się zmieniać. NIGDY. Zawsze. Zapomniałeś wiersza w informacji o wydaniu? Utwórz nowy tag. Przestarzałe lub usuń stare.
Teraz dużo czytałem o „scalaniu takich i podobnych w takich i takich gałęziach, a potem w końcu w gałęzi tułowia”. Nazywa się to przepływem scalania i nie ma tutaj nic obowiązkowego . Nie dlatego, że masz gałąź pnia, musisz scalić wszystko.
Zgodnie z konwencją gałąź pnia może reprezentować bieżący stan rozwoju, ale dotyczy to prostego projektu sekwencyjnego, czyli projektu, który ma:
Ponieważ przy jednym (lub wszystkich) tych scenariuszach dostajesz cztery „pnie”, cztery „bieżące zmiany” i nie wszystko, co robisz w tym równoległym rozwoju, musi koniecznie zostać połączone z powrotem w „pień”.
W SVN znacznik i gałąź są bardzo podobne.
Tag = określony odcinek czasu, zwykle używany w wydaniach
Rozgałęzienie = również określony odcinek czasu, w którym rozwój może być kontynuowany, zwykle używany w głównych wersjach, takich jak 1.0, 1.5, 2.0 itd., A następnie po zwolnieniu tagujesz gałąź. Dzięki temu możesz nadal obsługiwać wersję produkcyjną, jednocześnie przechodząc do przodu z przełomowymi zmianami w bagażniku
Bagażnik = przestrzeń robocza dla programistów, tutaj powinien nastąpić cały rozwój, a następnie zmiany zostały scalone z powrotem z wydań branżowych.
Naprawdę nie mają żadnego formalnego znaczenia. Folder jest folderem SVN. Są ogólnie przyjętym sposobem organizacji twojego projektu.
Pień jest tam, gdzie utrzymujesz swoją główną linię rozwoju. Folder oddziałów to miejsce, w którym możesz tworzyć gałęzie, które trudno wyjaśnić w krótkim poście.
Gałąź jest kopią podzbioru projektu, nad którym pracujesz niezależnie od pnia. Może chodzi o eksperymenty, które nigdzie nie mogą się udać, a może o kolejne wydanie, które później wrócisz do bagażnika, gdy stanie się stabilny.
A folder znaczników służy do tworzenia oznaczonych kopii repozytorium, zwykle w punktach kontrolnych wydania.
Ale, jak powiedziałem, do SVN folder jest folderem. branch
, trunk
a tag to tylko konwencja.
Używam słowa „kopiuj” swobodnie. SVN tak naprawdę nie robi pełnych kopii rzeczy w repozytorium.
Bagażnik jest linia rozwoju, który posiada najnowszy kod źródłowy i możliwości. Powinien zawierać najnowsze poprawki błędów, a także najnowsze funkcje dodane do projektu.
Te gałęzie są zwykle używane do zrobienia czegoś z dala od tułowia (lub innej linii rozwojowej), które w przeciwnym razie zerwania kompilacji. Nowe funkcje są często wbudowane w gałąź, a następnie scalone z powrotem w pień. Gałęzie często zawierają kod, który niekoniecznie jest zatwierdzony dla linii rozwojowej, z której się wywodzi. Na przykład programista może wypróbować optymalizację czegoś w gałęzi i połączyć się ponownie z linią programistyczną tylko wtedy, gdy optymalizacja jest zadowalająca.
Te znaczniki są obrazami z repozytorium w określonym czasie. Nie powinno się na nich rozwijać. Najczęściej są używane do wykonania kopii tego, co zostało wydane klientowi, abyś miał łatwy dostęp do tego, z czego korzysta klient.
Oto link do bardzo dobrego przewodnika po repozytoriach:
Warto również przeczytać artykuły w Wikipedii.
Właśnie o to chodzi w tworzeniu oprogramowania, nie ma spójnej wiedzy o niczym, wszyscy zdają się mieć na swój sposób, ale to dlatego, że jest to stosunkowo młoda dyscyplina.
Oto moja prosta prosta droga
trunk - katalog trunk zawiera najbardziej aktualny, zatwierdzony i scalony fragment pracy. Wbrew temu, co wielu przyznało, mój bagażnik służy tylko do czystej, schludnej, zatwierdzonej pracy, a nie do obszaru rozwojowego, ale raczej do obszaru wydania.
W pewnym momencie, gdy bagażnik wydaje się gotowy do zwolnienia, jest on oznaczony i zwolniony.
oddziały - katalog oddziałów zawiera eksperymenty i bieżące prace. Praca pod oddziałem pozostaje tam, dopóki nie zostanie zatwierdzona do włączenia do pnia. Dla mnie jest to obszar, w którym cała praca jest wykonywana.
Na przykład: Mogę mieć gałąź iteracji-5 dla piątej rundy rozwoju produktu, być może gałąź prototypu-9 dla dziewiątej rundy eksperymentów i tak dalej.
tags - katalog tags zawiera migawki zatwierdzonych gałęzi i wydań pnia. Ilekroć gałąź zostanie zatwierdzona do scalenia z pniem lub nastąpi zwolnienie pnia, migawka zatwierdzonej gałęzi lub pnia zostanie wykonana pod tagami.
Podejrzewam, że dzięki tagom mogę dość łatwo przeskakiwać w czasie do przodu i do punktów.
Uważam, że to świetny samouczek dotyczące SVN, kiedy patrząc na stronie internetowej autora z OpenCV 2 Computer Vision Application Programming Cookbook i pomyślałem, że powinienem dzielić.
Ma samouczek na temat korzystania z SVN i znaczenia zwrotów „trunk”, „tag” i „branch”.
Cytowany bezpośrednio z jego samouczka:
Bieżąca wersja projektu oprogramowania, nad którym obecnie pracuje Twój zespół, zazwyczaj znajduje się w katalogu o nazwie trunk . W miarę rozwoju projektu deweloper aktualizuje tę wersję, naprawia błędy, dodaje nowe funkcje) i przesyła swoje zmiany w tym katalogu.
W dowolnym momencie możesz zawiesić wersję i przechwycić migawkę oprogramowania na obecnym etapie rozwoju. Zasadniczo odpowiada to oficjalnym wersjom oprogramowania, na przykład tym, które dostarczysz swoim klientom. Te migawki znajdują się w katalogu tagów twojego projektu.
Wreszcie często przydatne jest stworzenie w pewnym momencie nowej linii oprogramowania. Dzieje się tak na przykład, gdy chcesz przetestować alternatywną implementację, w której musisz zmodyfikować oprogramowanie, ale nie chcesz przesyłać tych zmian do głównego projektu, dopóki nie zdecydujesz, czy zastosujesz nowe rozwiązanie. Główny zespół może następnie kontynuować prace nad projektem, podczas gdy inni deweloperzy pracują nad prototypem. Umieścisz te nowe linie rozwoju projektu w katalogu o nazwie oddziały .
Katalog trunk jest katalogiem, który prawdopodobnie znasz, ponieważ służy do przechowywania najnowszych zmian. Twoja główna baza kodów powinna być w bagażniku.
Katalog oddziałów służy do przechowywania oddziałów, niezależnie od tego, jakie mogą być.
Katalog znaczników służy zasadniczo do oznaczania określonego zestawu plików. Robisz to w przypadku wydań, w których chcesz, aby „1.0” były tymi plikami w tych wersjach, a „1.1” były tymi plikami w tych wersjach. Zazwyczaj nie modyfikujesz tagów po ich utworzeniu. Aby uzyskać więcej informacji o znacznikach, zobacz Rozdział 4. Rozgałęzianie i scalanie (w Kontrola wersji z Subversion ).
Jednym z powodów, dla których każdy ma nieco inną definicję, jest to, że Subversion implementuje zerową obsługę gałęzi i tagów. Subversion mówi w zasadzie: przyjrzeliśmy się w pełni funkcjonalnym gałęziom i tagom w innych systemach i nie uznaliśmy ich za przydatne, więc nie wdrożyliśmy niczego. Zamiast tego po prostu zrób kopię do nowego katalogu z konwencją nazw . Wtedy oczywiście każdy może mieć nieco inne konwencje. Aby zrozumieć różnicę między prawdziwym tagiem a zwykłą konwencją kopiowania i nazewnictwa, zobacz wpis Wikipedia Tagi i gałęzie Subversion .
Tag = określony odcinek czasu, zwykle używany w wydaniach
Myślę, że to właśnie zwykle oznacza „tag”. Ale w Subversion:
Naprawdę nie mają żadnego formalnego znaczenia. Folder jest folderem SVN.
co wydaje mi się dość mylące: system kontroli wersji, który nie wie nic o gałęziach lub tagach. Z punktu widzenia implementacji myślę, że sposób tworzenia „kopii” przez Subversion jest bardzo sprytny, ale muszę wiedzieć o tym, co nazwałbym nieszczelną abstrakcją .
A może po prostu używałem CVS o wiele za długo.
Myślę, że pewne zamieszanie wynika z różnicy między koncepcją tagu a implementacją w SVN. Tag SVN to gałąź, która jest kopią. Modyfikowanie tagów jest uważane za niewłaściwe, a narzędzia takie jak TortoiseSVN ostrzegą cię, jeśli spróbujesz coś zmodyfikować za pomocą ../tags/ .. na ścieżce.
Nie jestem do końca pewien, czym jest „tag”, ale gałąź jest dość powszechną koncepcją kontroli źródła.
Zasadniczo gałąź to sposób pracy na zmianach w kodzie bez wpływu na pień. Powiedz, że chcesz dodać nową funkcję, która jest dość skomplikowana. Chcesz móc wprowadzać zmiany podczas ich wprowadzania, ale nie chcesz, aby wpłynęło to na pień, dopóki nie skończysz z tą funkcją.
Najpierw utworzysz oddział. Zasadniczo jest to kopia pnia w momencie tworzenia oddziału. Następnie wykonasz całą pracę w oddziale. Wszelkie zmiany dokonane w gałęzi nie wpływają na pień, więc pień jest nadal użyteczny, pozwalając innym na kontynuowanie pracy (np. Wprowadzanie poprawek błędów lub drobnych ulepszeń). Po zakończeniu funkcji możesz z powrotem zintegrować gałąź z magistralą. To spowodowałoby przeniesienie wszystkich zmian z gałęzi do pnia.
Istnieje wiele wzorów, które ludzie używają dla gałęzi. Jeśli masz produkt z wieloma głównymi wersjami obsługiwanymi jednocześnie, zazwyczaj każda wersja będzie oddziałem. Tam, gdzie pracuję, mamy oddział kontroli jakości i oddział produkcji. Przed wydaniem naszego kodu do kontroli jakości integrujemy zmiany w gałęzi kontroli jakości, a następnie wdrażamy od tego miejsca. Po wydaniu do produkcji integrujemy się z gałęzi kontroli jakości do gałęzi produkcji, dzięki czemu wiemy, że kod działający w produkcji jest identyczny z testowanym przez kontrolę jakości.
Oto wpis w Wikipedii dotyczący gałęzi , ponieważ prawdopodobnie wyjaśniają rzeczy lepiej niż ja. :)
Bagażnik : Po zakończeniu każdego sprintu w zwinny wychodzimy z częściowo wysyłanym produktem. Te wydania są przechowywane w bagażniku.
Oddziały : wszystkie równoległe kody rozwoju dla każdego trwającego sprintu są przechowywane w oddziałach.
Tagi : za każdym razem, gdy wydajemy wersję beta produktu częściowo wysyłanego, tworzymy dla niego tag. To daje nam kod, który był dostępny w tym momencie, pozwalając nam wrócić do tego stanu, jeśli jest to wymagane w pewnym momencie podczas programowania.
Dla osób zaznajomionych z GIT master w GIT jest równoważny pnia w SVN.
Oddział i znacznik mają tę samą terminologię w GIT i SVN.