Brancher / Étiqueter

La capacité d'isoler des changements sur une ligne de développement séparée est une des fonctionnalités des systèmes de contrôle de version. Cette ligne est appelée une branche. Les branches servent souvent à expérimenter de nouvelles fonctionnalités sans perturber la ligne de développement principale avec des erreurs de compilation et des bogues. Dès que la nouvelle fonctionnalité est assez stable, alors la branche de développement est fusionnée vers la branche principale (trunk).

Une autre fonctionnalité des systèmes de contrôle de version est la capacité de marquer des révisions particulières (par exemple une version déployée), donc vous pouvez à tout moment recréer une certaine version de votre application ou un environnement. Ce processus est connu comme l'étiquetage.

Subversion n'a pas de commandes spéciales pour créer des branches ou des étiquettes, mais utilise ce qu'on appelle des copies peu coûteuses à la place. Les copies peu coûteuses sont similaires aux hard links d'Unix, ce qui signifie qu'au lieu de faire une copie complète dans le dépôt, on crée un lien interne qui pointe vers un arbre ou une révision spécifique. En conséquence, les branches et les étiquettes sont très rapides à créer et ne prennent presque aucun espace supplémentaire dans le dépôt.

Créer une branche ou une étiquette

Si vous avez importé votre projet avec la structure de répertoire recommandée, créer une branche ou une étiquette est très simple :

Figure 4.54. La boîte de dialogue Branche/étiquette

La boîte de dialogue Branche/étiquette


Sélectionnez le dossier de votre copie de travail que vous voulez copier dans une branche ou une étiquette, et choisissez ensuite la commande TortoiseSVNBranche/étiquette....

Par défaut, l'URL de destination de la nouvelle branche sera l'URL source sur laquelle votre copie de travail est basée. Vous devrez éditer cette URL pour indiquer le nouveau chemin vers votre branche/étiquette. Ainsi, au lieu de

http://svn.collab.net/depot/NomDeProjet/trunk
      

vous allez peut-être passer à quelque chose comme

http://svn.collab.net/depot/NomDeProjet/tags/Release_1.10
      

Si vous ne vous souvenez pas de la convention de nommage que vous avez utilisée la dernière fois, cliquez sur le bouton à droite pour ouvrir l'explorateur de dépôt et voir la structure existante du dépôt.

Dossiers intermédiaires

Quand vous spécifiez l'URL cible, tous les dossiers jusqu'au père doivent déjà exister, ou vous aurez un message d'erreur. Dans l'exemple ci-dessus, l'URL http://svn.collab.net/depot/NomDeProjet/tags/ doit exister pour pouvoir créer l'étiquette Release_1.10.

Cependant, si vous voulez créer une branche/étiquette à une URL dont les dossiers intermédiaires n'existent pas encore, vous pouvez cocher l'option Créer les dossiers intermédiaires en bas de la boîte de dialogue. Si cette option est activée, tous les dossiers intermédiaires sont créés automatiquement.

Remarquez que cette option est désactivée par défaut pour éviter les fautes de frappe. Par exemple, si vous tapez comme URL cible http://svn.collab.net/depot/NomDeProjet/Tags/Release_1.10 au lieu de http://svn.collab.net/depot/NomDeProjet/tags/Release_1.10, vous aurez une erreur avec l'option désactivée, mais avec l'option activée un dossier Tags sera créé automatiquement, et vous vous retrouverez avec un dossier Tags et un dossier tags.

Maintenant vous devez choisir la source de la copie. Ici vous avez trois options :

Révision HEAD dans le dépôt

La nouvelle branche est copiée directement dans le dépôt de la révision HEAD. Aucune donnée n'a besoin d'être transférée depuis votre copie de travail et la branche est créée très rapidement.

Révision spécifique dans le dépôt

La nouvelle branche est copiée directement dans le dépôt mais vous pouvez choisir une révision plus ancienne. C'est utile si vous avez oublié de faire une étiquette quand vous avez sorti votre projet la semaine dernière. Si vous ne souvenez pas du numéro de révision, cliquez sur le bouton à droite pour afficher le journal de révision et sélectionner le numéro de révision à partir de là. Là encore, aucune donnée n'est transférée depuis votre copie de travail et la branche est créée très rapidement.

Copie de travail

La nouvelle branche est une copie identique à votre copie de travail locale. Si vous avez mis à jour quelques fichiers à une révision plus ancienne dans votre CdT, ou si vous avez fait des changements locaux, c'est exactement ceux-ci qui vont dans la copie. Naturellement cette sorte d'étiquette complexe peut impliquer des transferts de données de votre CdT vers le dépôt si elles n'y existent pas déjà.

Si vous voulez que votre copie de travail soit basculée automatiquement sur la branche nouvellement créée, utilisez la case à cocher Déplacer la copie de travail vers une nouvelle branche/étiquette. Mais si vous le faites, assurez-vous d'abord que votre copie de travail ne contient pas de modifications. Si c'est le cas, ces changements seront fusionnés dans la CdT de branche quand vous basculerez.

Si votre copie de travail contient d'autres projets incluant des propriétés svn:externals, ces ressources externes seront énumérées au bas de la fenêtre de branche/étiquette. Pour chaque ressource externe, le chemin cible et l'URL source sont affichés.

Si vous voulez vous assurer que la nouvelle étiquette est toujours dans un état cohérent, vérifiez toutes les références externes pour que leurs révisions soient épinglées. Si vous ne vérifiez pas les références externes et que ces références externes pointent vers une révision HEAD qui peut changer dans l'avenir, extraire la nouvelle étiquette extraira cette révision HEAD de la référence externe et votre étiquette pourrait ne plus compiler. Donc c'est toujours une bonne idée de positionner les références externes à une révision explicite en créant une étiquette.

Les éléments externes sont automatiquement épinglé soit à la révision courante de tête soit à la révision de travail de base, selon la source de la branche/tag :

Tableau 4.1. Révision épinglée

Copier la sourceRévision épinglée
Révision HEAD dans le dépôtrévision HEAD du dépôt externe
Révision spécifique dans le dépôtrévision HEAD du dépôt externe
Copie de travailrévision de BASE de la CdT de la référence externe


Références externes avec références externes

Si un projet qui est inclus comme référence externe a lui-même des références externes, alors celles-ci ne seront pas étiquetées ! Seules les références externes qui sont les enfants directs peuvent être étiquetées.

Appuyez sur OK pour livrer la nouvelle copie dans le dépôt. N'oubliez pas de mettre un commentaire. Notez que la copie est créée dans le dépôt.

Notez qu'à moins que vous choisissiez de basculer votre copie de travail vers la branche juste créée, créer une branche ou une étiquette ne modifie pas votre copie de travail. Même si vous créez la branche depuis votre CdT, ces changements sont livrés dans la nouvelle branche, pas dans le trunk, donc votre CdT peut toujours être marquée comme modifiée par rapport au trunk.

Autres manières de créer une branche ou une étiquette

Vous pouvez aussi créer une branche ou une étiquette sans avoir de copie de travail. Pour ce faire, ouvrez l'explorateur de dépôt. Vous pouvez faire glisser des répertoires vers un nouvel endroit. Pour créer une copie, vous devez garder la touche Ctrl appuyée lorsque vous faites glisser le répertoire, sinon celui-ci n'est pas copié, mais déplacé.

Vous pouvez également faire glisser un dossier avec le bouton droit de la souris. Dès que vous relâchez le bouton, un menu contextuel s'affiche pour vous permettre de choisir entre la copie ou le déplacement du dossier. Bien sûr, pour créer une branche ou une étiquette, vous devez copier le dossier, pas le déplacer.

Il y a une autre façon de faire dans la boîte de dialogue de journal. Vous pouvez afficher la boîte de dialogue de journal, par exemple du trunk, sélectionner une révision (soit la révision HEAD tout en haut, soit une révision antérieure), faire un clic droit et choisir Créer une branche/étiquette depuis une révision.

Extraire ou aller sur...

... telle (n')est (pas) la question. Tandis qu'une extraction extrait tout de la branche désirée du dépôt dans votre répertoire de travail, TortoiseSVNAller sur... transfère seulement les données modifiées dans votre copie de travail. Bon pour la charge réseau, bon pour votre patience. :-)

Pour pouvoir travailler avec votre branche ou votre étiquette récemment générée, vous avez plusieurs méthodes. Vous pouvez :

  • TortoiseSVNExtraire pour faire une extraction propre dans un dossier vide. Vous pouvez extraire vers n'importe quel emplacement sur votre disque local et vous pouvez créer autant de copies de travail de votre dépôt que vous le souhaitez.

  • Basculer votre copie de travail courante vers la copie nouvellement créée dans le dépôt. Choisissez de nouveau le dossier de niveau supérieur de votre projet et utilisez TortoiseSVNAller sur... du menu contextuel.

    Dans la boîte de dialogue suivante, entrez l'URL de la branche que vous venez juste de créer. Choisissez le bouton radio Révsion HEAD et cliquez sur OK. Votre copie de travail est basculée vers la nouvelle branche/étiquette.

    Aller sur... fonctionne comme Mettre à jour dans le sens où il ne se débarrasse jamais de vos changements locaux. Les changements que vous avez faits à votre copie de travail qui n'ont pas encore été livrés seront fusionnés quand vous faites Aller sur. Si vous ne voulez pas que cela arrive alors vous devez ou livrer les changements avant la bascule, ou faire revenir votre copie de travail à une révision déjà livrée (typiquement HEAD).

  • Si vous voulez travailler sur le trunk et une branche, mais sans le coût d'une nouvelle extraction, vous pouvez utiliser l'explorateur Windows pour copier votre extraction du trunk dans un autre dossier, puis utiliser la commande TortoiseSVNAller sur... sur cette copie pour en faire la branche.

Figure 4.55. La boîte de dialogue Aller sur

La boîte de dialogue Aller sur


Bien que Subversion lui-même ne fasse aucune distinction entre les étiquettes et les branches, la manière dont elles sont typiquement utilisées diffère un peu.

  • Les étiquettes sont typiquement utilisées pour garder un instantané du projet à une étape particulière. Elles ne sont normalement pas utilisées pour du développement — c'est ce à quoi servent les branches, et c'est la raison pour laquelle nous avons recommandé la structure de dépôt /trunk /branches /tags en premier lieu. Travailler sur une révision d'étiquette n'est pas une bonne idée, mais dans la mesure où vos fichiers locaux ne sont pas protégés en écriture, il n'y a rien qui vous empêche de le faire accidentellement. Cependant, si vous essayez de livrer vers un chemin dans le dépôt qui contient /tags/, TortoiseSVN vous avertira.

  • Il peut arriver que vous deviez faire de nouveaux changements à une version déployée que vous avez déjà étiquetée. La façon correcte de le gérer est de créer d'abord une nouvelle branche à partir de l'étiquette et de livrer cette branche. Faites vos changements sur cette branche et créez ensuite une nouvelle étiquette depuis cette nouvelle branche, par exemple Version_1.0.1.

  • Si vous modifiez une copie de travail créée à partir d'une branche et livrez, alors tous les changements seront livrés sur la nouvelle branche et pas sur le trunk. Seules les modifications sont stockées. Le reste demeure une copie peu coûteuse.