web-dev-qa-db-fra.com

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

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 séparé appelé "project_docs".

J'aimerais 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?

155
leftend

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 inclure uniquement des informations sur le dossier docs et de le charger dans l'autre référentiel.

Serait quelque chose comme ceci:

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.

182
Samuel

svndumpfilter a un défaut sérieux: si un fichier ou un chemin est copié d'un chemin que vous filtrez à un chemin en cours de filtrage, svndumpfilter ne pourra pas renseigner l'historique et le travail échouera.

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

30
compie

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

6
Adam Bellaire

Pour référence future:

La documentation SVN indique clairement:

Si vous envisagez 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), comme le contenu ne sera alors pas en 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 chargement SVN.

Ainsi, lorsque vous effectuez cette opération, ne faites pas de substitutions de chaînes avec sed uniquement le 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.

2
nios

Je ne crois pas que vous puissiez le faire à distance (c'est-à-dire sans copie locale). Mais cela devrait fonctionner: svn export le dossier du serveur d'origine, puis svn add le à votre nouveau repo.

Comme:

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

Edit: D'oh, ça laisse tomber l'histoire. Utilisez svnadmin comme Samuel décrit .

2
Peter Stone

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 l'intégralité du référentiel.

J'ai donc uniquement exporté les révisions dans lesquelles mon répertoire a été modifié (cela risque de ne pas fonctionner si le répertoire que vous souhaitez exporter contient des références à d'autres emplacements de votre référentiel).

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 votre URL de dépôt (URL_to_docs), emplacement sur le serveur (/svn/old_repo) et le chemin d'accès à la documentation dans le référentiel (path/to/docs)

Vous pouvez facilement éditer votre docs_only.dump _ si vous souhaitez modifier l'emplacement de votre répertoire doc dans votre nouveau référentiel.

1
Renato