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.
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:
et vous voulez une structure comme:
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
svnadmin dump
fichiers pour chacun de vos référentiels. Le fournisseur doit être disposé/capable de fournir ceci - il est votre code!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 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
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 ...
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.
Consultez la révision 1 du référentiel A sur votre disque dur.
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.
Copiez les fichiers de votre extraction de A (moins) les fichiers .svn, à votre extraction de C, dans le dossier Repository_A.
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.
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.
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