Logo subversion

Subversion offre une manière intéressante d'inclure le contenu d'un dépôt dans un autre dépôt. C'est très utile, par exemple, lorsque vous avez un dépôt avec des routine génériques que vous voulez utiliser dans plusieurs projets sans avoir à dupliquer le code commun dans chacun de ces dépôts (pour des raisons évidentes de maintenabilité).

Attention, il s'agit ici de code commun et, en aucun cas de dépendances. Il existe des outils pour gérer les dépendances dans de multiples langages (Maven, Ivy, Gradle pour Java, PEAR pour PHP ....). Ces dépendances n'ont rien à faire dans le dépôt d'un gestionnaire de code source.

Attention (bis): l'utilisation de cette fonctionnalité crée, d'une certaine manière, une dépendance à Subversion, tous les outils de gestion de source ne la possédant pas (toutefois, Git possède un mécanisme similaire...).

En utilisant la propriété svn:externals, vous pouvez indiquer à subversion de récupérer le contenu d'un dépôt externe dans un répertoire donné.

Vous indiquez la propriété svn:externals sur un répertoire existant. La valeur de cette propriété est une liste de valeurs répertoire/dépôt séparées par des espaces.

Voyons un exemple. Habituellement, vous n'aurez qu'un seul dépôt externe, mais dans l'exemple, il y en aura deux, juste pour montrer comment créer une liste.

Supposons que vous avez les dépôts subversion externes http://svn.poum.fr/chemin/vers/depot_un et http://svn.poum.fr/chemin/vers/depot_deux.

Vous voulez ajouter depot_un dans le répertoire dossier_de_depot_un et depot_deux dans dossier_de_depot_deux. Créez un fichier texte contenant la valeur que prendra la propriété svn:externals:

$ cat >svn_ext_val.txt

dossier_de_depot_un http://svn.poum.fr/chemin/vers/depot_un

dossier_de_depot_deux http://svn.poum.fr/chemin/vers/depot_deux

Maintenant, positionnons la propriété d'un répertoire déjà dans subversion. Dans l'exemple, ce sera le répertoire courant:

svn propset svn:externals . -F svn_ext_val.txt

Maintenant, lorsque vous faites un svn update, dossier_de_depot_un sera créé et contiendra le contenu de depot_un, et dossier_de_depot_deux avec celui de depot_deux.

Étonnant, non ?

Voir la source ici.