This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.

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 l'un de nos exemples précédents, 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 ^/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, beaucoup de 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.

[Astuce] Astuce

Typiquement, les sous-dossiers déportés partagent un ancêtre commun avec l'emplacement d'où ils ont été déportés. Cependant, svn switch peut déporter un sous-dossier pour refléter un emplacement du dépôt qui ne partage aucun ancêtre avec ce sous-dossier. Pour ce faire, vous devez utiliser l'option --ignore-ancestry.

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 [43].

[Astuce] Astuce

Les administrateurs qui doivent modifier l'URL d'un dépôt accessible via HTTP sont encouragés à ajouter à leur fichier de configuration httpd.conf une redirection permanente de l'ancienne URL vers la nouvelle (à l'aide de la directive RedirectPermanent). Les clients Subversion affichent généralement la nouvelle URL du dépôt dans les messages d'erreur produits lorsque l'utilisateur essaye de travailler avec une copie de travail qui pointe vers l'ancienne URL. Depuis Subversion 1.7, les clients font un pas supplémentaire en faisant pointer automatiquement la copie de travail vers la nouvelle URL.

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.



[43] Vous pouvez cependant utiliser svn relocate si l'URL de votre serveur change et si vous ne voulez pas abandonner votre copie de travail existante. Reportez-vous à svn relocate dans Guide de référence de svn : le client texte interactif pour des détails et des exemples.