È necessario eseguire entrambi.
Inizia con la risposta accettata da @Norman: utilizzare un repository con un ramo denominato per release.
Quindi, disporre di un clone per ramo di rilascio per la creazione e il test.
Una nota chiave è che anche se si utilizzano più repository, si dovrebbe evitare di usare transplant
per spostare i changeset tra di loro perché 1) cambia hash, e 2) può introdurre bug che sono molto difficili da rilevare quando ci sono conflitti cambia tra il changeset che trapiantate e il ramo di destinazione. Si vuole fare la solita merge invece (e senza premerge: sempre controllare visivamente la fusione), che si tradurrà in quanto @mg detto al termine della sua risposta:
La potenza grafico appare diverso, ma ha la stessa struttura e il risultato finale è lo stesso.
Più verbosely, se si utilizzano più repository, il repository "trunk" (o di default, principale, lo sviluppo, a prescindere) contiene TUTTI di modifiche in TUTTE repository. Ogni repository di release/branch è semplicemente un ramo nel trunk, tutti riuniti in un modo o l'altro nel trunk, fino a quando non si vuole lasciare indietro un vecchio rilascio. Pertanto, l'unica vera differenza tra il repository principale e il repository singolo nello schema di diramazione denominato è semplicemente se i rami sono denominati o meno.
Ciò dovrebbe rendere evidente il motivo per cui ho detto "iniziare con un repository". L'unico repository è l'unico posto in cui avrai mai bisogno di cercare any changeset in qualsiasi release. Puoi ulteriormente etichettare i changeset sui rami di rilascio per il controllo delle versioni. È concettualmente chiaro e semplice e semplifica l'amministrazione di sistema, poiché è l'unica cosa che deve essere sempre disponibile e recuperabile in ogni momento.
Tuttavia, è comunque necessario mantenere un clone per ramo/versione che è necessario creare e testare. È banale come è possibile hg clone <main repo>#<branch> <branch repo>
e quindi hg pull
nel repository di succursale verrà solo tirare nuovi changeset su tale ramo (oltre a changeset antenato su rami precedenti che sono stati uniti).
Questa configurazione si adatta meglio i kernel linux impegnano modello della unico estrattore (non ci si sente bene ad agire come Lord Linus. Presso la nostra azienda che noi chiamiamo il ruolo integratore), come il repo principale è l'unica cosa che gli sviluppatori devono clonare e l'estrattore deve coinvolgere. La manutenzione dei repository è puramente per la gestione dei rilasci e può essere completamente automatizzata. Gli sviluppatori non devono mai passare da/push ai repository delle filiali.
L'esempio di @ mg è stato rifuso per questa configurazione. Punto di partenza:
[a] - [b]
Fai un ramo chiamato per una versione, diciamo "1.0", quando si arriva a alpha release. Commit correzioni di bug su di esso:
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
(1.0)
non è un vero e proprio insieme di modifiche dal nome ramo non esiste finché non si commettono. (È possibile eseguire un commit banale, ad esempio aggiungere un tag, per assicurarsi che i rami nominati siano creati correttamente.)
L'unione [m1]
è la chiave per questa configurazione. A differenza di un repository per sviluppatori in cui può esistere un numero illimitato di teste, NON si desidera avere più teste nel repository principale (eccetto per il ramo vecchio, dead release come menzionato prima). Pertanto, ogni volta che si dispone di nuovi changeset sui rami di rilascio, è necessario unirli nuovamente al ramo predefinito (o a un ramo di release successivo) immediatamente. Questo garantisce che qualsiasi correzione di bug in una versione sia inclusa anche in tutte le versioni successive.
Nello sviluppo frattempo sul ramo di default continua verso la prossima release:
------- [c] - [d]
/
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
E come al solito, è necessario unire le due teste sul ramo di default:
------- [c] - [d] -------
/ \
[a] - [b] ------------------ [m1] - [m2]
\ /
(1.0) - [x] - [y]
e questo è il 1.0 clone di diramazione:
[a] - [b] - (1.0) - [x] - [y]
Ora è un esercizio aggiungere il ramo successivo di rilascio . Se è 2.0, si diramerà definitivamente. Se è 1.1, puoi scegliere di diramare 1.0 o predefinito. Indipendentemente da ciò, ogni nuovo changeset su 1.0 dovrebbe essere prima unito al ramo successivo, quindi a default. Questo può essere fatto automaticamente se non c'è conflitto, risultando in una semplice fusione vuota.
Spero che l'esempio chiarisca i miei punti precedenti.In sintesi, i vantaggi di questo approccio sono:
- Un singolo repository autorevole che contiene il changeset completo e la cronologia delle versioni.
- Gestione di rilascio chiara e semplificata.
- Flusso di lavoro chiaro e semplificato per sviluppatori e integratori.
- Facilita le iterazioni del flusso di lavoro (revisioni del codice) e l'automazione (unione automatica vuota).
hg update per sé does this: il main repo contiene il difetto ed rami stabili, e la stable repo è il clone ramo stabile. Tuttavia, non utilizza il ramo versione, poiché i tag di versione lungo il ramo stabile sono abbastanza buoni per i suoi scopi di gestione del rilascio.
se il changeset proviene da un utente diverso, sarebbe stato registrato, quindi l'utilizzo dei cloni non è niente male. Quando si spinge una nuova caratteristica, spesso non è interessante sapere che l'hai fatto da un repository separato. C'è anche un'estensione localbranch, che ti dà un solo ramo locale. Utile quando la clonazione del repository è associata a costi elevati (tempo/spazio). –
facendo riferimento a: "I cloni sono ottimi per esperimenti rapidi" - No, non lo sono! Cosa succede se hai qualche tousands di file in repo? La clonazione richiederà anni (in qualsiasi momento al di sopra di 1 minuto) mentre il cambio di ramificazione è di un solo istante (<1 secondo). Continuare a usare i rami nominati inquinerà il log delle modifiche. Non è un vicolo cieco? O mi manca qualcosa? – seler
OK seler; Sembra una modifica alla sua argomentazione originale; I cloni sono buoni laddove il sovraccarico di più copie complete non è importante per te, o quando puoi usare i link simbolici/hardlink di hg per mitigare il costo delle copie di lavoro locali separate per filiale. –