Parcours des branches

La commande svn switch transforme une copie de travail existante de telle sorte qu'elle pointe vers une branche différente. Bien que la connaissance de cette commande ne soit pas absolument nécessaire pour travailler avec des branches, elle fournit un raccourci utile. Dans notre exemple précédent, après avoir créé votre branche privée, vous avez extrait une toute nouvelle copie de travail du nouveau répertoire du dépôt. À la place, vous pouvez simplement demander à Subversion de modifier votre copie de travail de /calc/trunk pour qu'elle pointe vers l'emplacement de la nouvelle branche :

$ cd calc

$ svn info | grep URL
URL: http://svn.exemple.com/depot/calc/trunk

$ svn switch http://svn.exemple.com/depot/calc/branches/ma-branche-calc
U   entier.c
U   bouton.c
U   Makefile
Actualisé à la révision 341.

$ svn info | grep URL
URL: http://svn.exemple.com/depot/calc/branches/ma-branche-calc

« Faire pointer » (ou « déporter ») une copie de travail qui n'a pas de modifications locales vers une branche différente a pour résultat que la copie de travail a exactement le même aspect que si vous aviez effectué une extraction brute du répertoire. C'est en général plus efficace d'utiliser cette commande, car les différences entre les branches sont souvent minimes. Le serveur n'envoie que le minimum de modifications nécessaire pour faire pointer votre copie de travail vers le répertoire de la branche.

La commande svn switch accepte également l'option --revision (-r), pour que que vous ne soyez pas obligé de faire pointer votre copie de travail vers la révision HEAD de la branche.

Bien sûr, la plupart des projets sont plus compliqués que notre exemple calc et contiennent de multiples sous-dossiers. Les utilisateurs de Subversion suivent souvent un algorithme précis quand ils utilisent des branches :

  1. Copier le « tronc » entier du projet vers une nouvelle branche

  2. Ne déporter qu'une partie de la copie de travail du tronc pour qu'elle pointe sur la branche.

En d'autres termes, si un utilisateur sait que le travail sur la branche ne doit avoir lieu que sur un sous-dossier donné, il utilise svn switch pour ne faire pointer que ce sous-dossier vers la branche (ou parfois des utilisateurs ne vont faire pointer qu'un unique fichier de travail vers la branche !). De cette façon, l'utilisateur peut continuer à recevoir les mises à jour normales du « tronc » vers la plus grande partie de sa copie de travail, mais les portions déportées ne seront pas touchées (à moins que quelqu'un ne propage une modification à sa branche). Cette fonctionnalité ajoute une dimension complètement nouvelle au concept de « copie de travail mixte » : les copies de travail peuvent non seulement contenir un mélange de révisions de travail, mais elles peuvent également contenir un mélange d'emplacements du dépôt.

Si votre copie de travail contient un certain nombre de sous-arborescences pointant vers des emplacements variés du dépôt, elle continue à fonctionner normalement. Quand vous la mettez à jour, vous recevez comme il se doit les correctifs pour chaque sous-arborescence. Quand vous effectuez une propagation, vos modifications locales s'appliquent toujours au dépôt en tant qu'une unique modification atomique.

Remarquez que bien qu'il soit possible pour votre copie de travail de pointer vers une variété d'emplacements du dépôt, ces emplacements doivent tous faire partie du même dépôt. Les dépôts Subversion ne sont pas encore capables de communiquer entre eux ; cette fonctionnalité est prévue à l'avenir [25].

Parce que svn switch est essentiellement une variante de svn update, elle se comporte de la même manière ; toute modification locale présente dans votre copie de travail est préservée lorsque de nouvelles données arrivent en provenance du dépôt.

[Astuce] Astuce

Vous-êtes vous déjà trouvés dans une situation où vous effectuez des modifications complexes (dans votre copie de travail de /trunk) et réalisez soudainement : « Mais, ces modifications ne devraient-elles pas être dans leur propre branche ? » Une excellente technique pour accomplir ceci peut être résumée en deux étapes :

$ svn copy http://svn.exemple.com/depot/calc/trunk \
           http://svn.exemple.com/depot/calc/branches/nouvelle-branche \
      -m "Création de la branche 'nouvelle-branche'."
Révision 353 propagée.
$ svn switch http://svn.exemple.com/depot/calc/branches/nouvelle-branche
À la révision 353.

La commande svn switch, à l'instar de svn update, préserve vos modifications locales. Désormais, votre copie de travail pointe vers la branche nouvellement créée et la prochaine fois que vous lancerez svn commit vos modifications y seront envoyées.



[25] Vous pouvez cependant utiliser svn switch avec l'option --relocate si l'URL de votre serveur change et si vous ne voulez pas abandonner votre copie de travail existante. Reportez-vous à svn switch pour des détails et des exemples.