60 votes

Combinaison de plusieurs référentiels SVN en un seul

Après avoir examiné les réponses à ma question précédente ( Un seul référentiel SVN ou plusieurs ? ), j'ai décidé de regrouper les quelque quatre dépôts que j'ai en un seul. Cela conduit bien sûr à la question suivante, quelle est la meilleure façon de procéder ?

Existe-t-il un moyen de combiner deux ou plusieurs dépôts en conservant l'historique des versions pour les deux ?

Edit : Je dois également préciser que j'utilise Assembla.com, qui ne donne pas accès à la commande svnadmin, AFAIK.

Un autre montage : Est-ce vraiment important ? Si svnadmin fonctionne sur les URL, alors ce n'est pas un problème.

1 votes

svnadmin doc : "Comme svnadmin fonctionne via un accès direct au référentiel (et ne peut donc être utilisé que sur la machine qui détient le référentiel), il se réfère au référentiel avec un chemin, et non une URL."

74voto

Ken Gentle Points 10162

Edit : Oh bien, l'édition de la question a été faite pendant que je tapais. C'est une réponse à

Existe-t-il un moyen de combiner deux ou plusieurs dépôts en conservant l'historique des versions pour les deux ?


En supposant que

Les référentiels existants ont une structure du type :

  • Dépôt de la racine
    • branches
    • tags
    • tronc

et vous voulez une structure du type :

  • Dépôt de la racine
    • projetA
      • branches
      • tags
      • tronc
    • projetB
      • branches
      • tags
      • tronc

Puis pour chacun de vos dépôts de projet :

svnadmin dump > project<n>.dmp

Puis pour chacun des fichiers de vidage :

svn mkdir "<repo url>/project<n>"
svnadmin load --parent-dir "project<n>" <filesystem path to repos>

Des manipulations plus complexes sont possibles, mais celle-ci est la plus simple et la plus directe. Changer la structure du référentiel des sources pendant un dump/load est dangereux, mais faisable par une combinaison de svnadmin dump , svndumpfilter l'édition manuelle ou les filtres de texte supplémentaires et svnadmin load


Traiter avec un fournisseur tiers

  • Demande svnadmin dump pour chacun de vos référentiels. Le fournisseur devrait être prêt à vous fournir ces informations. est votre code !
  • Créer un dépôt SVN localement.
  • Effectuez les actions énumérées ci-dessus pour les fichiers de vidage.
  • Vérifiez que la structure du référentiel est correcte avec votre client préféré.
  • Créer un fichier dump pour les dépôts combinés.
  • Demandez au fournisseur de remplir un nouveau référentiel à partir de ce fichier de vidage.

YMMV : Cela semble être une approche raisonnable, mais je n'ai jamais travaillé avec un fournisseur tiers de ce type.

0 votes

Cette dernière partie est exactement ce que je cherchais ! J'étais sur le point de renoncer à mes chances quand j'ai lu ceci. Merci.

0 votes

Si votre hébergeur subversion utilise subversion 1.4 ou plus, vous pouvez toujours svnsync le référentiel vers un référentiel local et (après la synchronisation) vider cette base de données.

1 votes

Et certains fournisseurs de subversion (par exemple Google Code) permettent svnsync /vers/ un dépôt. Vous pouvez donc y télécharger le résultat avec svnsync après avoir effectué la fusion ailleurs.

11voto

lvmisooners Points 644

Avec Subversion 1.7, vous êtes maintenant capable de faire des dumps à distance. C'est-à-dire sans avoir accès au système de fichiers local et à la base de données de Subversion. svnadmin dump commandement.

Vous pouvez utiliser svnrdump pour obtenir un dump complet d'un référentiel distant. Voir la documentation pour les détails de la syntaxe.

Notez que le serveur ne doit pas nécessairement utiliser la version 1.7, mais uniquement le client.

http://svnbook.red-bean.com/en/1.7/svn.ref.svnrdump.c.dump.html

0 votes

À partir de svn 1.4, vous pouvez également utiliser svnsync pour créer une copie locale du dépôt distant. svn.apache.org/repos/asf/subversion/trunk/notes/svnsync.txt

10voto

Davide Gualano Points 5832

Oui, en utilisant svnadmin dump et svnadmin load .

Supposons que vous ayez deux dépôts, l'un avec HEAD révision 100 et l'autre avec HEAD révision 150.

Vous videz le premier référentiel et le chargez dans le nouveau : vous vous retrouvez avec l'histoire complète du premier référentiel, de la révision 0 à la révision 150.

Ensuite, vous videz le second référentiel et le chargez dans le nouveau : il est chargé avec son historique complet, les seules choses qui changent sont les numéros de révision réels. L'historique du second référentiel sera représenté dans le nouveau référentiel de la révision 151 à la révision 250.

L'historique complet des deux référentiels est conservé, seuls les numéros de révision changent pour le référentiel qui est importé en second.

Il en va bien sûr de même pour plus de deux dépôts.

EDIT : J'ai posté pendant que tu éditais, donc je n'ai pas vu ta note...

1 votes

Juste une petite note - il semble qu'un peu d'italien se soit glissé pendant que vous écriviez votre commentaire. Il faut dire "et", et non "e" :-)

0 votes

Eheh, tu as raison, parfois mes doigts italiens tapent plus vite que mon cerveau qui essaie d'être anglais ne peut le faire :D

5voto

Hatim Heffoudhi Points 42

Vous pouvez charger plusieurs fichiers dump dans un seul dépôt en suivant les étapes suivantes.

Racine du dépôt :

 projectA
    branches 
    tags
    trunk
 projectB
    branches
    tags
    trunk

Vous devez d'abord créer le répertoire (projet A, projet B) dans votre dépôt Root comme ceci :

$ svn mkdir -m "Initial project root" \
file:///var/svn/repository_root/Project_A\
file:///var/svn/repository_root/Project_B\
file:///var/svn/repository_root/Project_C\

Revision 1 committed.

Et après cela, vous pouvez charger vos fichiers dump :

Utilisez le paramètre --parent-dir DIRECTORY

$ svnadmin load /var/svn/repository_root --parent-dir Project_A < file-dump-PRJA.dump
…
$ svnadmin load /var/svn/repository_root --parent-dir Project_B < file-dump-PRJB.dump

De cette façon, vous aurez un dépôt qui contient plusieurs dépôts vidés.

3voto

Kibbee Points 36474

Si vous n'avez pas accès à svnadmin, ce sera difficile mais faisable. Disons que vous avez les dépôts A et B, et que vous voulez les fusionner dans le dépôt C. Voici les étapes que vous devriez suivre pour accomplir ceci.

  1. Extrayez la révision 1 du référentiel A sur votre disque dur.

  2. Créez un répertoire, appelé Repository_A sur la racine de votre référentiel C, et extrayez-le sur votre disque dur local.

  3. Copiez les fichiers de votre check-out de A (moins) les fichiers .svn, vers votre check-out de C, dans le dossier Repository_A.

  4. Effectuer un Commit sur C.

Mettez à jour votre copie de travail du référentiel A à la révision 2 , et effectuez les étapes 3 et 4, et répétez avec chaque révision successive jusqu'à ce que vous atteigniez la tête.

Maintenant, faites la même chose avec B.

Cela ferait essentiellement la même chose que ce que @Davide Gualano suggérait, sans nécessiter svnadmin. Vous pourriez probablement écrire un simple script pour faire cela pour vous, ou s'il n'y a pas beaucoup de révisions, vous pourriez simplement le faire manuellement.

0 votes

Oui, le résultat final sera le même que la solution utilisant svnadmin dump and load, mais cela prendra probablement beaucoup de temps.

0 votes

Le résultat final aura des métadonnées légèrement différentes. Toutes les modifications seront vérifiées par un seul développeur sur une courte période de temps. Vous devrez également faire preuve d'ingéniosité pour que votre script copie les commentaires de contrôle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X