web-dev-qa-db-fra.com

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

Après avoir examiné les réponses à ma question précédente ( n référentiel SVN ou plusieurs? ), j'ai décidé de prendre les 4 référentiels que j'ai et de les consolider en un seul. Bien sûr, cela conduit à la question quelle est la meilleure façon de le faire?

Existe-t-il un moyen de combiner deux référentiels ou plus en conservant l'historique des versions pour les deux?

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

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

58
nickf

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

Existe-t-il un moyen de combiner deux référentiels ou plus 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
    • branches
    • mots clés
    • trunk

et vous voulez une structure comme:

  • racine du référentiel
    • projectA
      • branches
      • mots clés
      • trunk
    • projetB
      • branches
      • mots clés
      • trunk

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

svnadmin dump > project<n>.dmp

Ensuite, 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 c'est la plus simple, la plus directe. La modification de la structure du référentiel source lors d'un vidage/chargement est dangereuse, mais réalisable via une combinaison de svnadmin dump, svndumpfilter, modification manuelle ou filtres de texte supplémentaires et svnadmin load


Traiter avec un fournisseur tiers

  • Demande svnadmin dump fichiers pour chacun de vos référentiels. Le fournisseur doit être disposé/capable de fournir ceci - il 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.

72
Ken Gentle

Avec Subversion 1.7, vous pouvez désormais effectuer des vidages à distance. Autrement dit, sans avoir accès au système de fichiers local et au svnadmin dump commande.

Vous pouvez utiliser svnrdump pour obtenir un vidage 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 exécuter la version 1.7, seulement le client.

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

10
Scott Coldwell

Oui, en utilisant vidage svnadmin et chargement svnadmin .

Supposons que vous ayez des référentiels, 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 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 conservateur, seuls les numéros de révision changent pour le référentiel importé pour la seconde.

Bien entendu, il en va de même pour plus de deux référentiels.

EDIT: J'ai posté pendant que vous éditiez, donc je n'ai pas vu votre note ...

9
Davide Gualano

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

  1. Consultez 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 extraction de A (moins) les fichiers .svn, à votre extraction de C, dans le dossier Repository_A.

  4. Effectuer un commit sur C.

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

Faites de même avec B.

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

3
Kibbee

Vous pouvez charger de nombreux fichiers de vidage dans un référentiel avec les étapes suivantes.

Racine du référentiel:

 projectA
    branches 
    tags
    trunk
 projectB
    branches
    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 qui contient de nombreux référentiels vidés.

3
Hatim

Les autres réponses à cette question m'ont permis de faire le script ci-dessous. Adaptez la carte REPOS à votre cas. En outre, vous souhaiterez peut-être déplacer les balises et les branches dans un répertoire "pré-agrégé" au lieu de directement dans les nouvelles branches et troncs.

#!/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}/branches -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
1
sthysel