Que signifient" branche"," étiquette "et" tronc " dans les dépôts Subversion?

j'ai beaucoup vu ces mots dans les discussions de Subversion (et je suppose du dépôt général). J'ai utilisé SVN pour mes projets ces dernières années, mais je n'ai jamais saisi le concept complet de ces répertoires.

ça veut dire quoi?

1139
demandé sur Shog9 2008-08-19 17:22:03

17 réponses

Hmm, je ne suis pas sûr D'être d'accord avec Nick re tag étant similaire à une branche. Une étiquette n'est qu'un marqueur

  • Tronc serait le principal organisme de développement, en provenance du début du projet jusqu'à présent.

  • branche sera une copie de code dérivé d'un certain point dans le tronc que est utilisé pour appliquer des changements majeurs pour le code, tout en préservant l'intégrité du code dans le coffre. Si les modifications majeures fonctionnent selon le plan, elles sont généralement fusionnées de nouveau dans le tronc.

  • Tag sera un point dans le temps sur le tronc ou une branche que vous souhaitez conserver. Les deux raisons principales pour la préservation serait que soit c'est une version majeure du logiciel, si alpha, beta, RC ou RTM, ou c'est le point le plus stable du logiciel avant que des révisions majeures sur le tronc ne soient appliquées.

dans les projets open source, les branches principales qui ne sont pas acceptées dans le tronc par les parties prenantes du projet peuvent devenir les bases pour fourches -- par exemple, les projets totalement séparés qui partagent une origine commune avec d'autres code source.

874
répondu Jon Limjap 2014-08-06 13:58:59

tout d'abord, comme @AndrewFinnell et @KenLiu le font remarquer, dans SVN les noms de répertoires eux-mêmes ne signifient rien -- "tronc, branches et tags" sont simplement une convention commune qui est utilisée par la plupart des dépôts. Tous les projets n'utilisent pas tous les répertoires (il est assez courant de ne pas utiliser de "tags" du tout), et en fait, rien ne vous empêche de les appeler comme vous le souhaitez, bien que briser les conventions soit souvent déroutant.

je vais décrire probablement le plus scénario d'usage courant des branches et des étiquettes, et donnez un exemple de scénario de la façon dont ils sont utilisés.

  • tronc : la principale zone de développement. C'est là que votre prochaine version majeure du code est présente, et a généralement toutes les nouvelles fonctionnalités.

  • Branches : chaque fois que vous lancez une version majeure, il obtient une branche créée. Cela vous permet de faire des corrections de bugs et de faire une nouvelle version sans avoir à publier les nouvelles fonctionnalités - éventuellement inachevées ou non testées.

  • Tags : chaque fois que vous libérez une version (version finale, release candidates (RC), et betas) vous faites une étiquette pour elle. Cela vous donne une copie ponctuelle du code tel qu'il était à cet état, vous permettant de revenir en arrière et de reproduire tous les bogues si nécessaire dans une version antérieure, ou de ré-éditer une version antérieure exactement comme il être. Les Branches et les tags dans SVN sont légers - sur le serveur, il ne fait pas de copie complète des fichiers, juste un marqueur disant "ces fichiers ont été copiés à cette révision" qui ne prend que quelques octets. Avec ceci à l'Esprit, vous ne devriez jamais vous soucier de créer une balise pour n'importe quel code libéré. Comme je l'ai dit plus tôt, les tags sont souvent omis et à la place, un changelog ou un autre document clarifie le numéro de révision quand une version est faite.


Par exemple, disons que vous commencez un nouveau projet. Vous commencez à travailler dans "trunk", sur ce qui sera éventuellement publié en version 1.0.

  • trunk/ - version de développement, qui sera bientôt 1.0
  • branches / - vide

une fois que le 1.0.0 est terminé, vous branchez le tronc dans une nouvelle branche "1.0", et créez une étiquette "1.0.0". Le travail sur ce qui sera éventuellement 1.1 se poursuit en tronc.

  • trunk/ - version de développement, bientôt 1.1
  • branches / 1.0 - 1.0.0 version de sortie
  • tags / 1.0.0-1.0.0 release version

vous rencontrez quelques bugs dans le code, et les corrigez dans le tronc, puis fusionnez les corrections avec la branche 1.0. Vous pouvez également faire le contraire, et corriger les bogues dans la branche 1.0 et ensuite les fusionner de nouveau à trunk, mais les projets restent généralement avec la fusion à Sens Unique seulement pour diminuer la chance de manquer quelque chose. Parfois, un bogue ne peut être corrigé que dans la version 1.0 parce qu'il est obsolète dans la version 1.1. Cela n'a pas vraiment d'importance: vous voulez seulement vous assurer de ne pas publier 1.1 avec les mêmes bogues qui ont été corrigés dans 1.0.

  • trunk / - version de développement, bientôt 1.1
  • branches / 1.0 - à venir 1.0.1 libération
  • tags/1.0.0 - 1.0.0 version

une fois que vous avez trouvé assez de bogues (ou peut-être un bogue critique), vous décidez de faire une version 1.0.1. Donc vous faites une étiquette "1.0.1" À partir de la branche 1.0, et vous relâchez le code. À ce point, le tronc contiendra ce qui sera 1.1, et la branche "1.0" contiendra le code 1.0.1. La prochaine fois que vous lancerez une mise à jour à 1.0, ce sera 1.0.2.

  • tronc/ - version de développement, bientôt 1.1
  • branches / 1.0 - prochaine version 1.0.2
  • tags/1.0.0 - 1.0.0 version
  • tags / 1.0.1-1.0.1 release version

finalement, vous êtes presque prêt à libérer 1.1, mais vous voulez faire une bêta d'abord. Dans ce cas, vous faites probablement une branche "1.1", et un "1.Étiquette de 1" beta1". Maintenant, travaillez sur ce qui sera 1.2 (ou 2.0 maybe) continue dans trunk, mais le travail sur 1.1 continue dans la branche "1.1".

  • trunk/ - version de développement, bientôt 1.2
  • branches / 1.0-prochaine version 1.0.2
  • branches / 1.1-à venir 1.1.0 release
  • tags/1.0.0 - 1.0.0 version
  • tags/1.0.1 - 1.0.1 version
  • tags / 1.1beta1-1.1 beta 1 version de sortie

une fois que vous libérez 1.1 final, vous faites une balise "1.1" de la branche "1.1".

vous pouvez également continuer à maintenir 1.0 si vous le souhaitez, en portant les corrections de bugs entre les trois branches (1.0, 1.1, et trunk). L'important est que pour chaque version principale du logiciel que vous maintenez, vous avez une branche qui contient la dernière version de code pour cette version.


une autre utilisation des branches est pour les caractéristiques. C'est là que vous branchez le tronc (ou l'une de vos branches de libération) et travaillez sur une nouvelle fonctionnalité en isolation. Une fois la fonctionnalité terminée, vous la fusionnez de nouveau et supprimez la branche.

  • trunk/ - version de développement, qui sera bientôt 1.2
  • branches / 1.1-prochaine version 1.1.0
  • branches / ui-rewrite - branche caractéristique expérimentale

l'idée de ceci est quand vous travaillez sur quelque chose de perturbateur (qui pourrait tenir ou interférer avec d'autres personnes de faire leur travail), quelque chose d'expérimental (qui peut même ne pas le faire dans), ou peut-être juste quelque chose qui prend beaucoup de temps (et vous avez peur si elle tient en place une version 1.2 quand vous êtes prêt à la branche 1.2 À partir du tronc), vous pouvez le faire dans l'isolement dans la branche. Généralement, vous tenir à jour avec trunk en y fusionnant des modifications tout le temps, ce qui rend plus facile à ré-intégrer (fusionner de nouveau avec trunk) lorsque vous avez terminé.


notez aussi, le schéma de version que j'ai utilisé ici n'est qu'un parmi tant d'autres. Certaines équipes effectueraient des versions de correction/maintenance de bogues comme 1.1, 1.2, etc., et des changements majeurs comme 1.x, 2.x, etc. L'usage ici est le même, mais vous pouvez nommer la branche "1" ou "1.x" au lieu de "1.0" ou "1.0.x". (Mis à part, versioning sémantique est un bon guide sur la façon de faire des numéros de version).

540
répondu gregmac 2012-04-10 06:05:55

en plus de ce que Nick a dit, Vous pouvez en savoir plus à Streaming Lines: Branching Patterns for Parallel Software Development

enter image description here

dans cette figure main est le tronc, rel1-maint est une branche et 1.0 est une étiquette.

93
répondu grom 2012-05-03 00:46:06

en général (vue agnostique d'outil), une branche est le mécanisme utilisé pour le développement parallèle. Une SCM peut avoir de 0 à n branches. Subversion a 0.

  • le tronc est une branche principale recommandé par Subversion , mais vous n'êtes en aucun cas obligé de le créer. Vous pouvez l'appeler 'main' ou 'releases', ou ne pas en avoir du tout!

  • Branche représente un effort de développement. Il ne doit jamais être nommé d'après une ressource (comme 'vonc_branch'), mais après:

    • un but "myProject_dev" ou "myProject_Merge'
    • un dégagement de périmètre 'myProjetc1.0_dev or myProject2.3_Merge " ou " myProject6..2_Patch1"...
  • Tag est un instantané de fichiers afin d'accéder facilement à cet état. le problème est que tag et branch sont les mêmes dans Subversion . Et je recommande certainement l'approche paranoïaque:

    vous pouvez utiliser l'un des scripts de contrôle d'accès fournis avec Subversion pour empêcher quiconque de faire autre chose que de créer de nouvelles copies dans la zone tags.

une étiquette est finale. Son contenu devrait ne jamais changer. JAMAIS. Jamais. Tu as oublié une ligne dans le communiqué? Créer une nouvelle balise. Obsolète ou enlever l'ancienne.

maintenant, j'ai lu beaucoup de choses sur "la fusion de Tel et tel dans tel et tel branches, puis finalement dans la branche principale". Cela s'appelle flux de travail de fusion et il y a rien obligatoire ici . Ce n'est pas parce que vous avez un tronc branche fusionner quoi que ce soit.

par convention, la branche principale peut représenter l'état actuel de votre développement, mais c'est pour un projet séquentiel simple, qui est un projet qui a:

  • Non développement "à l'avance" (pour la préparation de la prochaine version impliquant de tels changements qu'ils ne sont pas compatibles avec le développement "trunk" actuel)
  • n'as pas de refactoring (pour l'essai d'une nouvelle technique de choix)
  • pas à long terme maintien d'une version précédente

parce qu'avec un (ou tous) de ces scénarios, vous obtenez quatre "troncs", quatre "current developments", et pas tout ce que vous faites dans ce développement parallèle devra nécessairement être fusionné en 'trunk'.

74
répondu VonC 2016-01-03 20:07:14

SVN une balise et de la direction générale sont vraiment similaires.

étiquette = une tranche temporelle définie, habituellement utilisée pour les rejets

branche = aussi une tranche définie dans le temps que le développement peut continuer, habituellement utilisé pour la version majeure comme 1.0, 1.5, 2.0, etc, puis quand vous relâchez vous étiqueter la branche. Cela vous permet de continuer à soutenir une version de production tout en allant de l'avant avec les changements de rupture dans le coffre

Trunk = espace de travail de développement, c'est là que tout le développement devrait se produire, et puis les changements fusionnés retour des versions de la branche.

37
répondu Nick Berardi 2008-08-19 13:25:17

Ils n'ont pas vraiment de sens officiel. Un dossier est un dossier à SVN. Ils sont une façon généralement acceptée d'organiser votre projet.

  • le tronc est l'endroit où vous gardez votre ligne principale de développement. Le dossier branche est l'endroit où vous pourriez créer, bien, des branches, qui sont difficiles à expliquer dans un court post.

  • une branche est une copie d'un sous-ensemble de votre projet sur lequel vous travaillez séparément de la tronc. Peut-être que c'est pour des expériences qui pourraient ne pas aller n'importe où, ou peut-être que c'est pour la prochaine version, que vous fusionnerez plus tard de nouveau dans le tronc quand il deviendra stable.

  • et le dossier tags est destiné à la création de copies étiquetées de votre dépôt, généralement aux points de contrôle de publication.

mais comme je l'ai dit, pour SVN, un dossier est un dossier. branch , trunk et tag ne sont qu'une convention.

j'utilise le mot "copier" libéralement. SVN ne fait pas réellement des copies complètes des choses dans le dépôt.

29
répondu Eric Z Beard 2016-01-03 20:01:46

le tronc est la ligne de développement qui détient le code source et les fonctionnalités les plus récents. Il doit avoir les dernières corrections de bugs dans les dernières fonctionnalités ajoutées au projet.

les branches sont habituellement utilisées pour faire quelque chose loin du tronc (ou autre ligne de développement) qui autrement casser la construction. Les nouvelles fonctionnalités sont souvent construites dans une branche et ensuite fusionnées dans le tronc. Les succursales contiennent souvent des codes qui ne sont pas nécessairement approuvés pour la ligne de développement dont elles sont issues. Par exemple, un programmeur pourrait essayer une optimisation sur quelque chose dans une branche et ne fusionner à nouveau dans la ligne de développement une fois que l'optimisation est satisfaisante.

les "tags sont des instantanés du dépôt à un moment donné. Aucun développement ne devrait se produire sur ceux-ci. Ils sont le plus souvent utilisés pour prendre une copie de ce qui a été communiqué à un client pour que vous puissiez facilement avoir accès à ce qu'un client utilise.

voici un lien vers un très bon guide pour les dépôts:

les articles dans Wikipedia valent également la peine d'être lus.

13
répondu mbillard 2008-08-19 13:37:32

maintenant c'est ça le truc avec le développement de logiciels, il n'y a pas de connaissances cohérentes sur quoi que ce soit, tout le monde semble avoir sa propre façon, mais c'est parce que c'est une discipline relativement jeune de toute façon.

Voici ma plaine façon simple,

trunk - le répertoire de trunk contient les travaux les plus récents, approuvés et fusionnés. Contrairement à ce que beaucoup ont avoué, mon tronc est seulement pour nettoyer, propre, approuvé le travail, et non pas une zone de développement, mais plutôt une zone de libération.

à un moment donné, lorsque le tronc semble prêt à être libéré, il est étiqueté et relâché.

branches - le répertoire branches contient des expériences et des travaux en cours. Travailler sous une branche y reste jusqu'à ce est approuvé pour être fusionné dans le tronc. Pour moi, c'est la région où le travail est effectué.

par exemple: je peux avoir une itération-5 branche pour une cinquième ronde de développement sur le produit, peut-être un prototype-9 branche pour une neuvième ronde d'expérimentation, et ainsi de suite.

tags - le répertoire tags contient des instantanés des branches approuvées et des versions du tronc. Chaque fois qu'une branche est approuvé à fusionner dans le coffre, ou d'une version du tronc, un instantané de la branche ou du tronc version dans tags.

je suppose qu'avec des étiquettes je peux sauter d'avant en arrière à travers le temps à des points d'intérêt assez facilement.

11
répondu BakerTheHacker 2009-06-30 11:50:56

j'ai trouvé ce grand tutoriel concernant SVN quand je regardais le site Web du auteur du OpenCV 2 Ordinateur Cookbook de programmation D'Application de Vision et j'ai pensé que je devrais partager.

il a un tutoriel sur la façon d'utiliser SVN et ce que les expressions "trunk", " tag " et "branch" signifient.

Cité directement de son tutoriel:

la version actuelle de votre projet de logiciel, sur lequel votre équipe travaille actuellement, est généralement situé dans un répertoire appelé trunk . Au fur et à mesure de l'évolution du projet, le développeur met à jour la version pour corriger les bogues, ajouter de nouvelles fonctionnalités) et soumettre ses modifications dans ce répertoire.

à tout moment, vous pouvez figer une version et capturer un instantané du logiciel tel qu'il est à ce stade du développement. Cela correspond généralement à la les versions de votre logiciel, par exemple, celles que vous fournirez à vos clients. Ces snapshots sont situés dans le répertoire tags de votre projet.

enfin, il est souvent utile de créer, à un moment donné, une nouvelle ligne de développement pour votre logiciel. Cela arrive, par exemple, lorsque vous souhaitez tester une autre solution mise en œuvre dans laquelle vous devez modifier votre logiciel, mais vous ne voulez pas soumettre ces modifications pour le projet principal jusqu'à ce que vous décidiez d'adopter la nouvelle solution. L'équipe principale peut alors continuer à travailler sur le projet pendant que les autres développeurs travaillent sur le prototype. Vous mettriez ces nouvelles lignes de développement du projet dans un répertoire appelé branches .

10
répondu Vince 2018-06-15 15:14:46

Le tronc répertoire est le répertoire que vous êtes probablement plus familier, car il est utilisé pour contenir les modifications les plus récentes. Votre base de données principale doit être dans le coffre.

le répertoire branches est pour tenir vos branches, quelles qu'elles soient.

le répertoire tags est essentiellement pour marquer un certain ensemble de fichiers. Vous faites cela pour des choses comme les versions, où vous voulez que "1.0" soit ces fichiers à ces révisions et que "1.1" soit ces fichiers à ces révisions. les fichiers lors de ces révisions. Vous ne modifiez pas les étiquettes une fois qu'elles sont faites. Pour plus d'information sur les étiquettes, voir Chapitre 4. Brancher et fusionner (dans 1519100920 "contrôle de Version avec Subversion ).

9
répondu bradtgmurray 2012-04-09 18:08:45

L'une des raisons pour lesquelles tout le monde a une définition légèrement différente est que Subversion implémente zéro support pour les branches et les tags. Subversion dit essentiellement: nous avons regardé branches et tags complets" dans d'autres systèmes et nous ne les avons pas trouvés utiles, donc nous n'avons rien implémenté. Il suffit de faire une copie dans un nouveau répertoire avec un nom convention à la place . Ensuite, bien sûr chacun est libre d'avoir légèrement différentes conventions. Pour comprendre la différence entre une étiquette réelle et une simple copie + convention de nommage voir L'entrée Wikipédia Subversion tags & branches .

9
répondu MarcH 2012-04-09 18:23:30

Tag = a défini tranche dans le temps, généralement utilisé pour les versions

je pense que c'est ce que l'on traduit habituellement par "tag". Mais dans Subversion:

Ils n'ont pas vraiment de sens officiel. Un dossier est un dossier à SVN.

que je trouve plutôt déroutant: un système de contrôle de révision qui ne sait rien des branches ou des tags. Du point de vue de la mise en œuvre, I pensez que la façon Subversion de créer des " copies "est très intelligente, mais que je doive le savoir c'est ce que j'appellerais une abstraction fuyante .

ou peut-être que j'ai utilisé CVS bien trop longtemps.

8
répondu sme 2012-04-09 18:37:51

je pense qu'une partie de la confusion vient de la différence entre le concept d'une étiquette et la mise en œuvre dans SVN. Pour SVN une balise est une branche qui est une copie. Modifier des tags est considéré comme faux et en fait des outils comme TortoiseSVN vous avertiront si vous tentez de modifier quoi que ce soit avec ../balise./. dans le chemin.

6
répondu denis phillips 2008-08-19 17:24:07

Je ne suis pas vraiment sûr de ce qu'est un "tag", mais branch est un concept de contrôle des sources assez courant.

fondamentalement, une branche est un moyen de travailler sur des changements au code sans affecter le tronc. Dites que vous voulez ajouter une nouvelle fonctionnalité qui est assez compliqué. Vous voulez être en mesure de vérifier les changements au fur et à mesure que vous les effectuez, mais ne voulez pas que cela affecte le tronc jusqu'à ce que vous en ayez fini avec la fonctionnalité.

on crée D'abord une branche. C'est essentiellement une copie de tronc de l'époque où tu as fait la branche. Vous feriez alors tout votre travail dans la branche. Toute modification apportée à la branche n'affecte pas le tronc, donc le tronc est toujours utilisable, permettant à d'autres de continuer à y travailler (comme faire des corrections de bugs ou de petites améliorations). Une fois votre fonctionnalité terminée, vous réintégrerez la branche dans le tronc. Cela déplacerait tous vos changements de la branche au tronc.

il y a un certain nombre de modèles que les gens utilisent pour les branches. Si vous avez un produit avec plusieurs les versions majeures étant supportées à la fois, habituellement chaque version serait une branche. Là où je travaille, nous avons une branche QA et une branche Production. Avant de diffuser notre code à L'AQ, nous intégrons les changements à la branche de L'AQ, puis nous déployons à partir de là. Lors de la sortie vers la production, nous intégrons la branche QA à la branche Production, donc nous savons que le code courant dans la production est identique à ce que le QA a testé.

Voici l'entrée Wikipedia sur les branches , depuis ils expliquent probablement les choses mieux que moi. :)

5
répondu Herms 2012-04-09 18:26:25

Trunk est le répertoire de base du code de votre application. C'est ici que vous travaillez sur votre prochaine version.

Branche est un dossier qui vous permet de choisir un moment dans le temps et permet de suivre une autre voie de développement que celui de /Tronc. Une utilisation courante de la Direction Générale est de fournir à votre équipe de développement l'accès à un instantané actuel de votre application telle qu'elle existe dans la production, c.-à-d.: / Branche / production-maintenance.

ce concept de "branchement" permet à votre équipe de construire des corrections/améliorations à la production, sans affecter le travail en cours pour votre prochaine version, qui se passe actuellement dans /Trunk. Les Branches peuvent aussi être des mini-pièces de fonctionnalité qui, dans les grandes équipes, permettent aux développeurs de travailler atomiquement, et de fusionner à nouveau dans /Trunk à un moment donné dans l'avenir.

Tags est un dossier qui vous permet de prendre des instantanés de votre application, et de travailler avec les "builds". Cela permet à votre équipe de faire preuve de souplesse, tant dans les tests que dans la découverte des différences entre les constructions. Vous trouverez souvent une convention de nommage suivie dans / Branch, qui se rapporte à vos builds, i.e.. /Branche/2.0.0, /Branche/2.0.1, /Branche/3.1.0 , et ainsi de suite. La convention de nommage dépend de vous et de votre équipe; soyez cohérent!

4
répondu Errabi Ayoub 2016-12-02 14:11:22

Trunk : après l'achèvement de chaque sprint dans agile nous sortons avec un produit partiellement shippable. Ces versions sont conservées dans le tronc.

Branches : tous les codes de développement parallèle pour chaque sprint en cours sont conservés dans les branches.

Tags : chaque fois que nous sortons un produit partiellement shippable sorte de version bêta, nous faisons une étiquette pour elle. Ceci nous donne le code cela était disponible à ce moment-là, nous permettant de revenir à cet état si nécessaire à un moment donné au cours du développement.

1
répondu Ujjwal 2017-04-25 11:43:37

pour les personnes familiarisées avec GIT, master in Git est équivalent à trunk in SVN.

branche et étiquette a la même terminologie dans Git et SVN.

1
répondu Desert Rose 2018-04-04 05:07:23