Il est parfois utile de construire une copie de travail faite d'un certain nombre d'extractions différentes. Par exemple, vous pouvez vouloir que des fichiers ou des sous-répertoires différents viennent d'emplacements différents dans un référentiel, ou peut-être même de référentiels différents. Si vous voulez que chaque utilisateur ait la même disposition, vous pouvez définir les propriétés svn:externals de façon à positionner les ressources spécifiées dans les emplacements cibles souhaités.
Si vous souhaitez extraire une copie de travail du /projet1 dans D:\dev\projet1. Sélectionnez le dossier D:\dev\projet1, faites un click droit et choisissez → dans le menu contextuel. La boîte de dialogue Propriétés apparaît. Allez alors dans l'onglet Subversion. Il vous permet de modifier les propriétés. Cliquez . Choisissez la propriété svn:externals dans la liste déroulante et écrivez dans la boîte de saisie l'URL du référentiel au format url dossier ou si vous voulez spécifier une révision particulière, -rREV url dossier. Vous pouvez ajouter plusieurs projets externes, 1 par ligne. Supposons que vous ayez saisi les propriétés suivantes sur D:\dev\projet1 :
http://sounds.red-bean.com/repos sounds http://graphics.red-bean.com/repos/fast%20graphics "quick_graphs" -r21 http://svn.red-bean.com/repos/skin-maker skins/toolkit
Cliquez ensuite sur et livrez vos changements. Quand vous (ou tout autre utilisateur) mettez à jour votre copie de travail, Subversion créera un sous-dossier D:\dev\projet1\sounds et extraira le projet des sons, un autre sous-dossier D:\dev\projet1\quick graphs contenant le projet des graphiques et finalement un sous-dossier imbriqué D:\dev\projet1\skins\toolkit contenant la révision 21 du projet de fabrication des thèmes.
Notez que les URL doivent être correctement saisies ou elles ne fonctionneront pas. Par exemple vous devez remplacer chaque espace par %20, comme dans le second exemple ci-dessus.
Si vous souhaitez que le chemin local contienne des espaces ou d'autres caractères spéciaux, vous pouvez les encadrer avec des doubles cotes, ou vous pouvez utiliser le caractère \ (backslash) comme un type de caractère shell Unix pour distinguer tout caractère spécial qu'il précède. Bien entendu, cela signifie que vous devez utiliser / (slash) comme délimiteur de chemin. Notez que ce comportement est nouveau dans Subversion 1.6 et ne fonctionnera pas avec les versions antérieures.
Vous devriez vous astreindre à l'utilisation de numéros de révision explicites dans toutes vos définitions externes, comme décrit ci-dessus. Cela revient à décider quand choisir un instantané différent d'informations externes et quel instantané particulier intégrer. En plus du bon sens consistant à ne pas être pas étonné par les changements aux référentiels tiers sur lesquels vous pourriez n'avoir aucun contrôle, utiliser des numéros de révision explicites signifie aussi que lorsque vous ramenez votre copie de travail à une révision précédente, vos définitions externes réintègrent également l'état qu'elles avaient dans cette révision précédente, ce qui signifie en conséquence que les copies de travail externes seront mises à jour pour correspondre à l'état qu'elles avaient quand votre référentiel était à cette révision précédente. Pour des projets logiciels, ce pourrait être la différence entre une réussite et un échec lors de la construction d'un instantané antérieur de votre complexe base de code.
Le format présenté ici a été introduit dans Subversion 1.5. Vous pouvez également rencontrer l'ancien format, constitué des mêmes informations dans un ordre différent. Le nouveau format est préféré, car il supporte plusieurs fonctionnalités utiles décrites ci-dessous, mais il ne fonctionne pas avec les clients des versions précédentes. Les différences sont présentées dans le Subversion Book.
Si le projet externe est dans le même référentiel, les changements que vous y faites seront inclus dans la liste de livraisons quand vous livrerez votre projet principal.
Si le projet externe est dans un référentiel différent, les changements que vous faites au projet externe seront signalés quand vous livrerez le projet principal, mais vous devez livrer ces changements externes séparément.
Si vous utilisez des URL absolues dans la valeur de l'option svn:externals and que vous déplacez votre copie de travail (i.e., si l'URL de votre référentiel change), alors vos références externes ne seront pas mises à jour et ne fonctionneront plus.
Pour éviter de tels problèmes, à partir de la version 1.5 du client, Subversion permet d'utiliser les chemins relatifs dans les références externes. Quatre méthodes différentes de spécifications d'URL relatives sont supportées. Dans les exemples suivants, considérez qu'il y a deux référentiels: un premier ici http://exemple.com/svn/repos-1 et un second là http://exemple.com/svn/repos-2. Nous avons une extraction de http://exemple.com/svn/repos-1/project/trunk dans C:\Working et la propriété svn:externals est activée sur le répertoire trunk.
Ces URL commencent toujours par la chaine de caractère ../ par exemple:
../../widgets/foo common/foo-widget
Extraira http://exemple.com/svn/repos-1/widgets/foo dans C:\Working\common\foo-widget.
Notez que l'URL est relative à l'URL du répertoire ayant la propriété svn:externals, pas à l'emplacement physique où le répertoire ayant la référence externe est stocké.
Ces URLs commencent toujours par la chaine de caractère ^/ par exemple:
^/widgets/foo common/foo-widget
Extraira http://exemple.com/svn/repos-1/widgets/foo dans C:\Working\common\foo-widget.
Vous pouvez facilement faire référence à d'autres référentiels ayant le même SVNParentPath (un répertoire commun hébergeant plusieurs référentiels). Par exemple:
^/../repos-2/hammers/claw common/claw-hammer
Extraira http://exemple.com/svn/repos-2/hammers/claw dans C:\Working\common\claw-hammer.
Les URL qui commencent par // ne comportent que la partie "scheme" de l'URL. C'est utile quand l'hôte est accédé de différentes manières selon l'emplacement du client ; i.e. on utilise http:// depuis l'intranet alors que le protocole svn+ssh:// est nécessaire depuis l'extérieur. Par exemple :
//exemple.com/svn/repos-1/widgets/foo common/foo-widget
Extraira http://exemple.com/svn/repos-1/widgets/foo ou svn+ssh://exemple.com/svn/repos-1/widgets/foo selon la méthode utilisée pour faire la livraison de C:\Working.
Les URL qui commencent par la chaine / ne contiennent que la partie "scheme" et le nom d'hôte de l'URI, par exemple :
/svn/repos-1/widgets/foo common/foo-widget
Extraira http://exemple.com/svn/repos-1/widgets/foo dans C:\Working\common\foo-widget. Mais si vous extrayez votre copie de travail depuis un autre serveur svn+ssh://autre.mirroir.net/svn/repos-1/projet1/trunk alors la référence externe extraira svn+ssh://autre.mirroir.net/svn/repos-1/widgets/foo.
Vous pouvez également précisé une révision d'ancrage ("peg") après l'URL, si nécessaire, par exemple: http://sounds.red-bean.com/repos@19.
Si vous avez besoin de plus d'informations sur la façon dont TortoiseSVN manipule les propriétés, lisez la section intitulée « Configuration des projets ».
Pour découvrir des méthodes différentes d'accéder aux sous-projets communs, lisez la section intitulée « Inclure un sous-projet commun ».
A partir de Subversion 1.6 vous pouvez ajouter des références externes relatives à des fichiers en utilisant la même syntaxe que pour les dossiers. Il y a néanmoins quelques limitations.
Le chemin vers le fichier en référence externe doit placer le fichier dans un dossier existant versionné. En général, il est logique de placer le fichier directement dans le dossier dont la propriété svn:externals est activée, mais cela peut être dans un sous-dossier versionné si nécessaire. A l'inverse, les répertoires externes vont créer automatiquement tout dossier intermédiaire non versionné requis.
L'URL pour un fichier en référence externe doit se trouver dans le même référentiel que l'URL dans laquelle le fichier externe sera inséré; les fichiers en référence externe inter-référentiel ne sont pas supportés.
Par beaucoup d'aspects, les fichiers en référence externe se comportent comme n'importe quel autre fichier versionné. Néanmoins, ils ne peuvent pas être déplacés ou supprimés avec les commandes standards; il faut passer par la modification de la propriété svn:externals.
Dans Subversion 1.6, il n'est pas possible de retirer un fichier en référénce externe de votre copie de travail une fois que vous l'y avez ajouté, même si vous supprimer complètement la propriété svn:externals. Vous devez extraire une nouvelle copie de travail pout retirer le fichier.