Combiner plusieurs référentiels SVN en un seul

Après avoir examiné les réponses à ma question précédente ( un référentiel SVN ou plusieurs? ), J’ai décidé de prendre les 4 ou 3 référentiels que je possède et de les regrouper. Cela conduit bien sûr à la question, quelle est la meilleure façon de le faire?

Est-il possible de combiner deux ou plusieurs référentiels en conservant l’historique des versions pour les deux?

Edit: je dois également souligner que j’utilise Assembla.com, qui ne donne pas access à la commande svnadmin, AFAIK

Une autre édition: Est-ce que c’est même important? Si svnadmin fonctionne sur les URL, alors ce n’est pas un problème.

Edit: Eh bien, l’édition de la question a été faite pendant que je tapais. Ceci est une réponse à

Est-il possible de combiner deux ou plusieurs référentiels en conservant l’historique des versions pour les deux?


En admettant que

Les référentiels existants ont une structure comme:

  • racine du référentiel
    • twigs
    • Mots clés
    • tronc

et vous voulez une structure quelque chose comme:

  • racine du référentiel
    • projetA
      • twigs
      • Mots clés
      • tronc
    • projectB
      • twigs
      • Mots clés
      • tronc

Ensuite, pour chacun de vos référentiels de projets:

svnadmin dump > project.dmp 

Ensuite, pour chacun des fichiers de vidage:

 svn mkdir "/project" svnadmin load --parent-dir "project"  

Des manipulations plus complexes sont possibles, mais c’est le plus simple, le plus simple. Changer la structure du référentiel source pendant un vidage / chargement est dangereux, mais faisable en combinant svnadmin dump , svndumpfilter , édition manuelle ou des filtres de texte supplémentaires et svnadmin load


Traiter avec un fournisseur tiers

  • Demander svnadmin dump fichiers de svnadmin dump pour chacun de vos référentiels. Le fournisseur doit être prêt / capable de fournir ceci – c’est votre code!
  • Créez un référentiel SVN localement.
  • Effectuez les actions répertorié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éez un fichier de vidage pour les référentiels 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 comme celui-ci.

Avec Subversion 1.7, vous pouvez désormais effectuer des sauvegardes à distance. C’est-à-dire sans avoir access au système de fichiers local ni à la commande svnadmin dump .

Vous pouvez utiliser svnrdump pour obtenir un vidage complet d’un référentiel distant. Voir la documentation pour plus de détails sur la syntaxe.

Notez qu’il n’est pas nécessaire que le serveur exécute 1.7, uniquement le client.

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

Oui, en utilisant svnadmin dump et svnadmin load .

Supposons que vous ayez des référentiels, l’un avec la révision HEAD 100 et l’autre avec la révision HEAD 150.

Vous déposez le premier référentiel et le chargez dans le nouveau: vous obtenez l’histoire complète du premier référentiel, de la révision 0 à la révision 150.

Ensuite, vous videz le deuxième 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 deuxième 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 preserver, seuls les numéros de révision changent pour le référentiel importé pour la seconde.

La même chose s’applique bien sûr à plus de deux référentiels.

EDIT: J’ai posté pendant que vous étiez en train de modifier, donc je n’ai pas vu votre note …

Vous pouvez charger de nombreux fichiers de vidage dans un référentiel en procédant comme suit.

Racine du référentiel:

  projectA twigs tags trunk projectB twigs tags trunk 

Vous devez d’abord créer le répertoire (projet A, projet B) dans la racine de votre référentiel 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 de vidage:

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 référentiel contenant de nombreux référentiels vidés.

Si vous n’avez pas access à svnadmin, ce serait difficile mais faisable. Supposons que vous ayez des repositorys A et B et que vous souhaitiez les fusionner dans le référentiel C. Voici les étapes à suivre pour y parvenir.

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

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

  3. Copiez les fichiers de votre fichier de sortie de A (moins) les fichiers .svn, à la caisse de C, dans le dossier Repository_A.

  4. Effectuer une validation sur C.

Mettez à jour votre copie de travail du référentiel A à la révision 2, effectuez les étapes 3 et 4 et répétez 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 @Davide Gualano, sans requérir svnadmin. Vous pourriez probablement écrire un script simple pour le faire pour vous, s’il n’y a pas beaucoup de révisions, vous pourriez le faire manuellement.

Les autres réponses à cette question m’ont permis de faire le script ci-dessous. Adaptez la carte REPOS à votre cas. En outre, vous pouvez déplacer les balises et les twigs dans un répertoire “pré-agrégé” au lieu de les insérer directement dans les nouvelles twigs et le nouveau tronc.

 #!/bin/bash NEWREPO=$(pwd)/newrepo NEWREPOCO="${NEWREPO}_co" DUMPS=repodumps REV="0:HEAD" REPOROOT=/data/svn/2.2.1/repositories/ TOOLDIR=/opt/svn/2.2.1/bin/ PATH=${PATH}:${TOOLDIR} # Old Repository mapping declare -A REPOS=( [BlaEntityBeans]='( [newname]="EntityBeans" )' [OldServletRepoServlet]='( [newname]="SpreadsheetImportServlet" )' [ExperimentalMappingXML]='( [newname]="SpreadsheetMappingXML" )' [NewImportProcess]='( [newname]="SpreadsheetImportProcess" )' ) dump() { rm -fr ${DUMPS} mkdir ${DUMPS} for repo in "${!REPOS[@]}" do local dumpfile=${DUMPS}/${repo}.dmp echo "Dumpimg Repo ${repo} to ${dumpfile}" svnadmin dump -r ${REV} ${REPOROOT}/${repo} > ${dumpfile} done } loadRepos() { # new big repo rm -fr ${NEWREPO} svnadmin create ${NEWREPO} svn mkdir file:///${NEWREPO}/trunk -m "" svn mkdir file:///${NEWREPO}/twigs -m "" svn mkdir file:///${NEWREPO}/tags -m "" # add the old projects as modules for currentname in "${!REPOS[@]}" do declare -A repo=${REPOS[$currentname]} local newname=${repo[newname]} echo "Loading repo ${currentname} soon to be ${newname}" dumpfile=${DUMPS}/${currentname}.dmp # import the current repo into a trmporary root position svn mkdir file:///${NEWREPO}/${currentname} -m "Made module ${currentname}" svnadmin load --parent-dir ${currentname} ${NEWREPO} < ${dumpfile} # now move stuff arround # first rename to new repo svn move file:///${NEWREPO}/${currentname} file:///${NEWREPO}/${newname} -m "Moved ${currentname} to ${newname}" # now move trunk, branches and tags for vc in {trunk,branches,tags} do echo "Moving the current content of $vc into ${NEWREPO}/${vc}/${newname}" svn move file:///${NEWREPO}/${newname}/${vc} file:///${NEWREPO}/${vc}/${newname} -m "Done by $0" done svn rm file:///${NEWREPO}/${newname} -m "Removed old ${newname}" done } dump loadRepos