2010-11-22 24 views
6

Nous avons plusieurs dépôts subversion: un pour le code commun et un pour chaque projet de premier niveau. Les projets de niveau supérieur ont un lien svn: external vers le tronc du référentiel commun. Avant de construire une version d'un projet, nous créons une branche du projet de niveau supérieur et créons également une branche parallèle dans le référentiel commun.Comment mettre à jour les externals Subversion

Comment pouvons-nous assurer automatiquement que la propriété svn: external dans le projet de haut niveau ramifié pointe vers la branche parallèle dans le répertoire commun - actuellement elle pointera sur "trunk" dans le référentiel commun. Nous sommes actuellement en train d'éditer manuellement ceci dans le projet ramifié.

Merci

Répondre

6

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.

+0

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. –