Si je vous comprends, vous voulez vous assurer que foo
et bar
partagent la même branche. foo
est votre projet maître et a un svn:externals
quelque part pointant vers bar
. Lorsque vous branchez foo
, vous voulez vous assurer que bar
utilise la même branche. La seule façon de s'assurer que c'est de créer votre référentiel avec les répertoires tags
et branches
à la racine de votre dépôt plutôt qu'à la racine du projet (comme la plupart des sites).
Vous pouvez ensuite utiliser des références externes relatives pour pointer du répertoire foo
qui contient le svn:external
à bar
. En outre, si vous marquez foo et un bar avec la même étiquette, foo et bar maintiendront leur relation:
$ svn propset svn:externals ../../bar common
Si vos branches étaient à la racine de votre répertoire, le répertoire common
pointera à la même branche pour foo
comme c'est le bar
.
Le gros problème avec snv:externals
est que si vous ne faites pas attention, vous pointez vers une version en constante évolution du répertoire que vous liez. Disons que quelqu'un a fait ceci:
$ svn propset svn:externals /projects/bar/trunk common
dans mon projet foo
. Je fais une version et copiez foo
à un tag. Toutefois, le répertoire common
que j'ai marqué sera modifié lorsque quelqu'un mettra à jour bar/trunk
. Cela rend presque impossible de reconstruire foo
. Lorsque j'utilise svn:externals
, je m'assure toujours de lier soit à une version balisée de bar
, soit à une révision spécifique, et si je fais un lien vers une révision spécifique, j'attache aussi mon URL à cette révision au cas où Quelqu'un décide de supprimer le répertoire que je lie à ma propriété svn:externals
.
Il n'y a rien dans Subversion qui mettra à jour automatiquement vos svn:externals
propriétés, mais vous pouvez rechercher tous svn: externals sur une arborescence de répertoires en utilisant
$svn propget -v -R svn:externals .
J'ai trouvé que svn:externals
finit généralement par être une plus grande la douleur que ça vaut la peine. Au lieu de cela, je stocke simplement l'objet construit de bar
ou une copie compressée de la source dans mon référentiel de versions, et dans le cadre de ma procédure de construction, je copie l'objet ou la source compressée de mon référentiel de versions.J'utilise des référentiels de sites Maven comme Nexus ou Artifactory comme référentiel de versions même si je ne fais pas de projet Maven ou même que je travaille dans un projet basé sur Java. Le référentiel Maven local fournit tous les outils dont vous avez besoin pour télécharger et télécharger vos paquets dépendants, plus Maven a le concept de référentiel release - où le code ne change jamais - et un référentiel snapshot où vous prévoyez de sortir le code, mais cela pourrait changer. Ceci est utile si vous pensez que bar
pourrait changer à cause de choses dont vous avez besoin dans foo
.
Merci pour les commentaires utiles. Cependant, nous n'avons pas pu réorganiser nos dépôts, nous avons donc écrit un fichier batch qui est exécuté lorsque nous souhaitons effectuer une branche pour une version. Le fichier batch fait la branche et met à jour svn: externals pour pointer vers la branche parallèle dans le référentiel commun. –