Vous devriez faire les deux.
Démarrer avec l'acceptées réponse de @Norman: Utilisation d'un référentiel avec une branche nommée par libération.
Ensuite, avoir un clone par communiqué de la direction générale pour la construction et l'essai.
Une des clés est à noter que même si vous utilisez plusieurs dépôts, vous devriez éviter d'utiliser des transplant
de déplacer les révisions entre eux parce que 1) il change de hachage, et 2) il peut introduire des bogues qui sont très difficiles à détecter quand il y a des modifications conflictuelles entre la révision de vous et de transplantation de la branche cible. Vous voulez faire l'habitude de fusion à la place (et sans premerge: vérifiez toujours l'état de la fusion), qui sera la conséquence de ce @mg a déclaré à la fin de sa réponse:
Le graphique peut semble différent, mais il a la même structure et le résultat final est le même.
De plus avec beaucoup de détails, si vous utilisez plusieurs dépôts, le "tronc" du référentiel (ou à défaut, du principal, développement, peu importe) contient TOUTES les révisions dans TOUS les référentiels. Chacune de presse/direction de référentiel est simplement une branche dans le coffre, le tout fusionné en arrière d'une manière ou d'une autre dans le tronc, jusqu'à ce que vous voulez laisser une ancienne version de retard. Par conséquent, la seule vraie différence entre le fait que les pensions et les pensions dans le nom de la branche schéma est simplement de savoir si les branches sont nommés ou non.
Qui devrait le rendre évident pourquoi j'ai dit "démarrer avec un repo". Que seul repo est le seul endroit où vous aurez besoin de regarder pour tout ensemble de modifications dans une version. Vous pouvez balise de révisions sur la libération des branches pour la gestion des versions. C'est conceptuellement simple et claire, et fait de l'administrateur système plus simple, car c'est la seule chose qui doit absolument être disponibles et récupérables à tout moment.
Mais vous avez encore besoin de maintenir un clone par branche/version que vous avez besoin pour construire et tester. Il est trivial comme vous pouvez vous en hg clone <main repo>#<branch> <branch repo>
, puis hg pull
dans la branche des pensions de tirer uniquement de nouvelles révisions à la branche (plus ancêtre des révisions sur les premières branches qui ont fusionné).
Cette configuration la mieux adaptée le noyau linux modèle de validation de l' unique extracteur (n'est-il pas se sentir bien à agir comme Seigneur de Linus. Au sein de notre société que nous appelons le rôle intégrateur), en tant que principal repo est la seule chose que les développeurs ont besoin de cloner et de l'extracteur doit tirer dans. L'entretien de la branche repos est purement pour la gestion de la publication et peuvent être entièrement automatisés. Les développeurs n'ont jamais besoin de retirer de pousser à la direction des pensions de titres.
Voici @mg l'exemple refondu pour cette installation. Point de départ:
[a] - [b]
Faire une branche nommée pour une version, disons "1.0", quand vous arrivez à la version alpha. Engager les corrections de bugs:
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
(1.0)
n'est pas un vrai ensemble de modifications depuis nommé branche n'existe pas jusqu'à ce que vous vous engagez. (Vous pourriez faire un trivial s'engager, comme l'ajout d'un tag, assurez-vous que les branches nommées sont correctement créés.)
La fusion [m1]
est la clé de cette installation. Contrairement à un développeur référentiel où il peut y avoir un nombre illimité de chefs, vous ne voulez PAS d'avoir plusieurs têtes dans votre repo (sauf pour les vieux, morts branche de version comme mentionné précédemment). Donc, chaque fois que vous avez de nouvelles révisions à la libération des branches, vous devez fusionner les de les ramener à la branche par défaut (ou d'une version ultérieure de la branche) immédiatement. Cela garantit que toute correction d'un bug dans une version est également inclus dans toutes les versions ultérieures.
Dans le même temps de développement sur la branche par défaut se poursuit vers la prochaine version:
------- [c] - [d]
/
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
Et comme d'habitude, vous avez besoin de fusionner les deux têtes sur la branche par défaut:
------- [c] - [d] -------
/ \
[a] - [b] ------------------ [m1] - [m2]
\ /
(1.0) - [x] - [y]
Et c'est la 1.0 branche clone:
[a] - [b] - (1.0) - [x] - [y]
Maintenant c'est un exercice d'ajouter la prochaine version de la branche. Si c'est 2.0, puis il va certainement branche par défaut. Si c'est 1.1, vous pouvez choisir de bifurquer 1.0 ou par défaut. Peu importe, toute nouvelle révision 1,0 doit d'abord être fusionné à la branche suivante, alors que par défaut. Ceci peut être fait automatiquement si il n'y a pas de conflit, résultant en un simple vide de fusion.
J'espère que l'exemple fait mes premiers points. En résumé, les avantages de cette approche est la suivante:
- Référence unique référentiel qui contient complète de l'ensemble de modifications et la version de l'histoire.
- Claire et simplifiée de la gestion des release.
- Claire et simplifiée de flux de travail pour les développeurs et intégrateurs.
- Faciliter le déroulement des opérations d'itérations (revues de code) et de l'automatisation (automatique vide de fusion).
Mise à JOUR hg lui-même ne se présente: le principal repo contient la valeur par défaut et stable branches, et l' stable repo est la branche stable clone. Il n'utilise pas de version de la branche, cependant, que la version des balises le long de la branche stable sont assez bon pour sa libération des fins de gestion.