Comment déplacer un seul dossier d'un référentiel Subversion vers un autre référentiel?

156

J'ai un dossier «docs» dans un référentiel Subversion nommé «projet». J'en suis venu à la conclusion qu'il devrait vraiment être conservé dans un référentiel Subversion distinct nommé "project_docs".

Je voudrais déplacer le dossier "docs" ( et toutes ses révisions ) vers le référentiel "project_docs". Y a-t-il un moyen de faire cela?

extrémité gauche
la source

Réponses:

183

Si vous avez accès au référentiel lui-même (et non à une copie de travail), vous devriez être en mesure de vider le référentiel actuel, de le filtrer pour n'inclure que des informations sur le dossier docs et de le charger dans l'autre référentiel.

Serait quelque chose comme ça:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

Sans accès au référentiel, vous ne pouvez pas gérer l'historique des révisions et vous devez vous contenter de copier les fichiers dans le nouveau référentiel et de les valider.

Samuel
la source
1
Bel exemple. Notez que comme indiqué dans la documentation à laquelle j'ai lié, cette solution renumérotera toutes les révisions afin qu'il n'y ait pas de "vides". Quelque chose à garder à l'esprit si vous faites référence aux révisions du document ailleurs.
Adam Bellaire
1
J'ai suggéré la suppression des révisions vides pour éviter d'ajouter un tas de révisions vides au référentiel cible, ce qui déroutait probablement tous ceux qui ne connaissaient pas la charge. Puisque --preserve-revprops conservera les messages de validation au lieu d'utiliser celui par défaut de chargement.
Samuel
11
Merci d'avoir répondu. Au cas où quelqu'un aurait besoin de savoir, si vous avez besoin de plus d'un dossier, placez simplement un espace entre eux dans la liste d'inclusion. Ex. ... include folderOne folderTwo
Robin Robinson
6
Renuméroter les révisions est probablement une mauvaise idée, car les messages de validation et les outils de suivi des problèmes peuvent y faire référence
Wim Coenen
5
Cela a fonctionné pour moi. Je suis un utilisateur Windows (Visual SVN Server) et ma première commande ressemblait à ceci, si cela aide quelqu'un:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris
30

svndumpfilter a un sérieux défaut - si un fichier ou un chemin a été copié d'un chemin que vous filtrez vers celui que vous filtrez, svndumpfilter ne pourra pas remplir l'historique et le travail échouera.

Vous pouvez utiliser svndumpfilter2 si vous rencontrez ce problème.

compie
la source
4
Voici un meilleur lien pour svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin
Vous pouvez dans ce cas ajouter le chemin requis à la liste ... en étant aussi spécifique que possible ... puis supprimer ces entrées du projet après l'importation.
James Gawron
6

Ceci est discuté dans la documentation SVN. Consultez la section Maintenance du référentiel sur svndumpfilter... Elle décrit spécifiquement comment vider les projets d'un référentiel central et les déplacer dans de nouveaux référentiels séparés.

Adam Bellaire
la source
2

Je ne pense pas que vous puissiez le faire à distance (c'est-à-dire sans copie locale). Mais cela devrait fonctionner: svn exportle dossier du serveur d'origine, puissvn add vers votre nouveau dépôt.

Comme:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

Edit: D'oh, cela laisse tomber l'histoire. Utilisez svnadmincomme Samuel le décrit .

Peter Stone
la source
3
Cependant, vous ne pouvez pas conserver les révisions sans accéder au référentiel lui-même. Si vous ne pouvez avoir qu'une copie de travail, c'est le mieux qu'il puisse faire.
Samuel
2

Pour référence future:

La documentation SVN rapporte clairement:

Si vous prévoyez de modifier manuellement le fichier de vidage pour supprimer un répertoire de niveau supérieur, assurez-vous que votre éditeur n'est pas configuré pour convertir automatiquement les caractères de fin de ligne au format natif (par exemple, \ r \ n en \ n), car le contenu ne sera alors pas d'accord avec les métadonnées. Cela rendra le fichier de vidage inutile.

Utilisez sed ou Vim pour remplacer le répertoire de niveau supérieur, mais ce nom de répertoire était également contenu dans un fichier de projet !!!! Cela provoque une erreur de somme de contrôle de charge SVN.

Ainsi, lorsque vous effectuez cette opération, ne faites pas de substitutions de chaîne avec sed du seul nom du chemin.

Remplacez "Node-path: old_path" par "Node-path: new_path". Voir le chapitre 5 du livre SVN «Administration du référentiel» pour plus de détails.

nios
la source
1

J'ai essayé d'utiliser la réponse acceptée, mais j'avais un énorme référentiel et je voulais exporter un petit répertoire, et je ne pouvais pas me permettre de vider tout le référentiel.

Donc, je n'ai exporté que les révisions où mon répertoire a changé (cela peut ne pas fonctionner si le répertoire que vous souhaitez exporter a des références à d'autres endroits dans votre repo).

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

Vous devez remplacer l'URL de votre dépôt ( ) URL_to_docs, l'emplacement dans le serveur ( /svn/old_repo) et le chemin d'accès aux documents dans le référentiel ( path/to/docs)

Vous pouvez facilement modifier votre docs_only.dumpsi vous souhaitez changer l'emplacement de votre répertoire doc dans votre nouveau référentiel.

Renato
la source