Question

Nous sommes en train de déplacer nos référentiels SVN d'une machine à une autre et un nouveau nom de domaine sera créé pour le nouveau référentiel. Le problème est que, dans le référentiel, il y a beaucoup de références svn: externals à d'autres projets dans le référentiel. Ainsi, par exemple, nous avons projectA, qui a dans les propriétés svn: externals:

external/libraryA svn://oldserver.net/repo/libraryA
external/libraryB svn://oldserver.net/repo/libraryB

... et ainsi de suite. Toutes les URL font référence à ce nom de domaine particulier, de sorte qu'il peut être facilement analysé. Ayant déjà appris ma leçon, je vais migrer ces URL pour qu'elles soient "svn: // localhost /", mais je dois trouver un moyen de parcourir l'historique du référentiel et de réécrire toutes les anciennes URL, de sorte que nous puissions encore. Découvrez les anciennes versions de ces projets sans avoir de liens brisés.

Comment pourrais-je m'y prendre?

Était-ce utile?

La solution

Comme vous avez indiqué que vous souhaitiez toujours pouvoir extraire les révisions plus anciennes, la seule solution consiste à "réécrire". l'historique complet (solution D mentionnée précédemment).

Pour ce faire, vous devez:

1) Sauvegardez le contenu du entier en utilisant svnadmin dump :

$ svnadmin dump /path/to/repos > original-dumpfile
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.

2) Modifiez le fichier de vidage pour modifier les URL svn: externals. C’est la partie la plus difficile : en supposant que le référentiel contienne également des données binaires, l’ouverture du fichier de vidage dans un éditeur de texte brut corrompra sans doute le fichier de vidage. J'ai eu de bonnes expériences en utilisant un "éditeur hexadécimal", par exemple le Editeur hexagonal gratuit XVI32

3) Créez un nouveau référentiel et chargez-y le fichier de vidage modifié:

$ svnadmin create newrepos
$ svnadmin load newrepos < modified-dumpfile

Pour plus d'informations, ce lien pourrait également vous intéresser:
http://svnbook.red-bean.com/fr/1.1/ch05s03.html

REMARQUE: Subversion 1.5 a en fait ajouté la prise en charge de URL relatives dans la propriété svn: externals, ce qui peut empêcher ce type de problèmes à l'avenir:
: http://subversion.tigris.org/svn_1.5_releasenotes.html#externals

Autres conseils

J'utiliserais SvnDumpTool pour cela. Il a exactement ce que vous cherchez:

svndumptool transform-prop svn:externals "(\S*) (|-r ?\d* ?)http://oldserver.net(/\S*)" "\2\3 \1" source.dumpfile source-fixed-externals.dumpfile

Ceci corrige chaque élément externe au format Subversion 1.5 . et utilise des URL relatives.

Donc svn: des externes comme:

external/libraryA svn://oldserver.net/repo/libraryA

devenir:

 /repo/libraryA external/libraryA

en utilisant des URL relatives racine du serveur.

J'ai dû déplacer 12 copies de travail sur 9 utilisateurs et 4 déploiements. C’était un changement simple, remplacer un domaine par une adresse IP, c’est-à-dire thing.domain.net - > 192.168.0.1

Attendre que svn relocate se comporte comme décrit (traverser les externes imbriqués). J'ai écrit une instruction DOS simple à exécuter à chaque emplacement:

pour / D% G dans (*) do ( cd ./%G & amp; svn relocate http://thing.domain.net http://192.168.0.1 & amp; cd ..)

Cela n'a pas fonctionné comme prévu: vous avez uniquement déplacé le WC parent.

Ma solution consistait à modifier les référentiels eux-mêmes (j'ai utilisé Tortoise Repo Browser) pour modifier l'emplacement des données externes. Suite à cette modification, une mise à jour du parent déplacé était tout ce qui était nécessaire pour tout aligner.

Ce serait probablement une bonne idée de demander à tous les utilisateurs de Tortoise d'effacer leur historique d'URL afin qu'ils n'effectuent pas d'opérations par inadvertance en utilisant l'ancienne URL (elle existe toujours dans la recherche DNS):

Paramètres- > Données sauvegardées- > Historique des URL- > Effacer

J'ai édité mon fichier de vidage avec vi mais je devais utiliser le fichier "-b". passez en mode binaire pour modifier, de sorte que tous les caractères pouvant être interprétés comme des fins de ligne ne soient pas convertis.

par exemple. vi -b nomfichier.dump

De plus, j’ai constaté que, si votre longueur d’URL change, il faut également modifier les longueurs de chaîne. Par exemple, considérons une entrée qui ressemble à ceci:

chemin du nœud: trunk / src / include

Node-kind: dir

Node-action: change

Prop-content-length: 192

Longueur du contenu: 192

K13

svn: externals

V 156

MGL_ABC svn: // nom_serveur / dir1 / dir2

MGL_DEF svn: // nom_serveur / dir1 / dir3

Lorsque vous modifiez ces URL, si la longueur de la chaîne change, vous devez également modifier le paramètre "192", "192". et " 156 " pour correspondre à la nouvelle longueur. J'ai trouvé difficile de calculer la longueur absolue, mais facile de trouver le différentiel.
Par exemple, supposons que l'URL 1 soit raccourcie de 3 caractères et l'URL 2, raccourcie de 4 caractères. Ensuite, vous devez soustraire '7' à chacun de ces trois nombres de longueur de chaîne.

Vous pourriez:

a) vérifiez l'ancienne révision et modifiez votre fichier hôtes pour qu'il pointe l'ancien nom vers la nouvelle adresse, puis svn update. Si le chemin de l'URL a également changé, eh bien, vous pouvez également:

b) prenez le temps d'écrire un script qui recherche les propriétés dans la copie de travail actuelle (ancienne révision) et modifie les URL à cet emplacement sans les valider. OU:

c) notez la ou les révisions où vous avez coché les nouvelles valeurs de propriété, extrayez l'ancienne version et fusionnez simplement ces révisions (qui ne concernent que les propriétés) dans votre copie de travail.

d) ou, éventuellement, utilisez svndump pour dump les données du référentiel, remplacez l’URL par une chaîne dans le dump, puis restaurez-le .. Je ne vous donnerais aucune garantie que cela fonctionne même; -)

Tous mes contacts externes se trouvaient dans des répertoires nommés flow . J'ai corrigé les URL dans mes externes avec ce one-liner (bash shell):

for p in $(find -maxdepth 4 -name flow); do svn ps svn:externals "$(svn pg svn:externals $p/.. | perl -pe 's/^(\w+) svn\+ssh.*thing\.domain\.net(.*)/$2 $1/')" $p/..; done
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top