Powinieneś zrobić jedno i drugie .
Zacznij od zaakceptowanej odpowiedzi od @Norman: użyj jednego repozytorium z jedną nazwaną gałęzią na wydanie.
Następnie przygotuj jeden klon na gałąź wydania do kompilacji i testowania.
Jedną kluczową uwagą jest to, że nawet jeśli używasz wielu repozytoriów, powinieneś unikać używania transplant
do przenoszenia zestawów zmian między nimi, ponieważ 1) zmienia to hash i 2) może wprowadzać błędy, które są bardzo trudne do wykrycia, gdy istnieją sprzeczne zmiany między zestawem zmian, przeszczep i gałąź docelową. Zamiast tego chcesz wykonać zwykłe scalanie (i bez premerge: zawsze wizualnie sprawdź scalanie), co spowoduje, że @mg powiedział na końcu swojej odpowiedzi:
Wykres może wyglądać inaczej, ale ma taką samą strukturę, a efekt końcowy jest taki sam.
Mówiąc bardziej szczegółowo, jeśli używasz wielu repozytoriów, repozytorium „główne” (lub domyślne, główne, programistyczne, cokolwiek) zawiera WSZYSTKIE zestawy zmian we WSZYSTKICH repozytoriach. Każde repozytorium wydania / gałęzi jest po prostu jedną gałęzią w linii głównej, wszystkie połączone z powrotem w jedną lub drugą stronę z powrotem do linii głównej, dopóki nie zechcesz zostawić starej wersji w tyle. Dlatego jedyną rzeczywistą różnicą między tym głównym repozytorium a pojedynczym repozytorium w schemacie nazwanych gałęzi jest po prostu to, czy gałęzie są nazwane, czy nie.
To powinno wyjaśnić, dlaczego powiedziałem „zacznij od jednego repozytorium”. To pojedyncze repozytorium jest jedynym miejscem, w którym będziesz kiedykolwiek potrzebować szukać zestawu zmian w dowolnej wersji . Możesz dalej oznaczać zestawy zmian w gałęziach wydania w celu przechowywania wersji. Jest koncepcyjnie przejrzysty i prosty oraz upraszcza administrowanie systemem, ponieważ jest to jedyna rzecz, która absolutnie musi być dostępna i możliwa do odzyskania przez cały czas.
Ale nadal musisz utrzymywać jeden klon na gałąź / wydanie, który musisz zbudować i przetestować. To trywialne, jak tylko możeszhg clone <main repo>#<branch> <branch repo>
, a następnie hg pull
w repozytorium gałęzi pobierze tylko nowe zestawy zmian z tej gałęzi (plus zestawy zmian przodków z wcześniejszych gałęzi, które zostały scalone).
Ta konfiguracja najlepiej pasuje do modelu zatwierdzania jądra Linuksa pojedynczego pullera (czy nie jest dobrze działać jak Lord Linus. W naszej firmie nazywamy integratorem ról ), ponieważ główne repozytorium jest jedyną rzeczą, którą programiści muszą sklonować, a ściągacz musi wciągnąć. Utrzymanie repozytoriów branżowych służy wyłącznie do zarządzania wersjami i może być całkowicie zautomatyzowane. Deweloperzy nigdy nie muszą wyciągać z repozytorium / wypychać do niego.
Oto przykład @ mg przekształcony dla tej konfiguracji. Punkt wyjścia:
[a] - [b]
Utwórz nazwaną gałąź dla wydania, powiedz „1.0”, kiedy dojdziesz do wydania alfa. Zatwierdź poprawki błędów:
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
(1.0)
nie jest prawdziwym zestawem zmian, ponieważ nazwana gałąź nie istnieje, dopóki nie zatwierdzisz. (Możesz wykonać trywialne zatwierdzenie, takie jak dodanie tagu, aby upewnić się, że nazwane gałęzie są poprawnie utworzone.)
Połączenie [m1]
jest kluczem do tej konfiguracji. W przeciwieństwie do repozytorium programistów, w którym może być nieograniczona liczba głowic, NIE chcesz mieć wielu głowic w swoim głównym repozytorium (z wyjątkiem starej, martwej gałęzi wydania, jak wspomniano wcześniej). Więc za każdym razem, gdy masz nowe zestawy zmian w gałęziach wydania, musisz natychmiast scalić je z powrotem do gałęzi domyślnej (lub późniejszej gałęzi wydania). Gwarantuje to, że wszelkie poprawki błędów w jednym wydaniu są również uwzględnione we wszystkich późniejszych wersjach.
W międzyczasie rozwój domyślnej gałęzi jest kontynuowany w kierunku następnej wersji:
------- [c] - [d]
/
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
I jak zwykle musisz scalić dwie głowice na domyślnej gałęzi:
------- [c] - [d] -------
/ \
[a] - [b] ------------------ [m1] - [m2]
\ /
(1.0) - [x] - [y]
A to jest klon gałęzi 1.0:
[a] - [b] - (1.0) - [x] - [y]
Teraz jest ćwiczeniem, aby dodać następną gałąź wydania. Jeśli jest to 2.0, to na pewno odłączy się domyślnie. Jeśli jest to 1.1, możesz wybrać rozgałęzienie 1.0 lub domyślne. Niezależnie od tego, każdy nowy zestaw zmian w wersji 1.0 powinien być najpierw scalony do następnej gałęzi, a następnie do domyślnego. Można to zrobić automatycznie, jeśli nie ma konfliktu, co skutkuje jedynie pustym scaleniem.
Mam nadzieję, że ten przykład wyjaśnia moje wcześniejsze uwagi. Podsumowując, zalety tego podejścia to:
- Jedno autorytatywne repozytorium zawierające pełny zestaw zmian i historię wersji.
- Przejrzyste i uproszczone zarządzanie wersjami.
- Przejrzysty i uproszczony przepływ pracy dla programistów i integratorów.
- Ułatw iteracje przepływu pracy (przeglądy kodu) i automatyzację (automatyczne puste scalanie).
UPDATE hg robi to samo : główne repozytorium zawiera domyślne i stabilne gałęzie, a stabilne repozytorium to stabilny klon gałęzi. Nie używa jednak gałęzi wersjonowanej, ponieważ znaczniki wersji wzdłuż gałęzi stabilnej są wystarczająco dobre do celów zarządzania wydaniami.