03juin 2012
Migrer une partie d'un dépôt subversion vers un autre dépôt
15:39 - Par Fabien Poulard - Geek & Technique
Avec l'expérience, je me rends compte que la structuration d'un dépôt subversion n'est jamais satisfaisante et que l'on se retrouve continuellement à vouloir bouger des choses, fusionner certains projets, en éclater d'autres... Parfois il est préférable de repartir proprement sur un nouveau dépôt, sans perdre l'historique des révisions accumulés dans l'ancien.
Import / Export
L'exportation puis l'importation d'un dépôt subversion s'opére simplement à l'aide de la commande svnadmin exécuté depuis l'hôte hébergeant le dépôt :
Pour l'exportation :
svnadmin dump /path/to/svn/repository/ > my-repository.svn.dump
Pour l'importation :
svnadmin load /path/to/svn/repository/ < my-repository.svn.dump
Facile !
Limiter l'import/export à une partie du dépôt
Lorsque l'on ne souhaite récupérer qu'une partie du dépôt, il faut se tourner vers l'utilitaire svndumpfilter. Celui-ci permet de limiter l'export à certains répertoires uniquement (mode include) ou bien à supprimer certains répertoires (mode exclude). Notez bien qu'il n'est pas possible de combiner ces deux modes.
Si par exemple vous ne souhaitez exporter que le projet /trunk/genesis-commons/, procédez comme suit :
svnadmin dump /path/to/svn/repository/ | svndumpfilter include --drop-empty-revs --renumber-revs /trunk/genesis-commons/ > my-project.svn.dump
Les options --drop-empty-revs et --renumber-revs permettent de supprimer les révisions qui ne concernent pas le projet et de renuméroter les révisions restantes de sorte à ce qu'elles se suivent.
Lors de l'export vous pouvez obtenir des messages d'erreurs du type Invalid copy source path. Les causes de ce type de message sont le plus couramment qu'une partie du projet que vous exportez a été copiée depuis une autre partie du dépôt qui n'est pas exportée. Le plus simple, mais pas forcément le plus heureux, est d'inclure la partie originale de laquelle provient l'élément manquant dans l'export.
Une fois l'export effectuée, il y a fort à parier que vous souhaitiez modifier le répertoire de destination de votre projet dans le dépôt vers lequel vous allez l'importer. Pour cela pas de solution clé en main : il faut éditer le fichier d'export ! Une petite indication pour automatiser le processus : les chemins des ressources sont préfixés par Node-path:. Il est donc possible d'automatiser en partie le processus avec sed :
sed -i 's@Node-path: my/previous/resource/path/\(.*\)@Node-path: my/new/path/\1@' my-project.svn.dump
Attention également à prendre en compte les instructions Node-copyfrom-path:.
En comparaison le chargement de l'export est des plus direct :
svnadmin load /path/to/svn/repository/ < my-project.svn.dump
Si toutefois vous souhaitez importer le projet dans un sous-répertoire particulier du dépôt :
svnadmin load /path/to/svn/repository/ --parent-dir my/project/new/directory < my-project.svn.dump
Ressources
Je n'aurais certainement pas été en mesure d'écrire ce billet sans les ressources ci-dessous :