Comment migrer / convertir de SVN à Mercurial (hg) sur Windows

Je suis à la recherche d’un outil permettant de migrer quelques référentiels SVN vers Mercurial, avec l’historique, les étiquettes, etc.

J’utilise TortoiseHg (Windows x32), donc ConvertExtensions est ignoré. Il y a quelques informations sur la façon de faire ce processus sur une machine Linux ( hgsvn ), mais je n’ai pas de machine Linux disponible.

Puis-je utiliser ces scripts Python sous Windows? Si oui, de quoi ai-je besoin pour le faire? Ou, quels autres outils puis-je utiliser pour effectuer ce processus?

En gros, comment convertir un projet SVN en Mercurial?

Je devais simplement aborder ce problème moi-même. J’ai une machine Windows XP avec un serveur Windows distinct hébergeant VisualSVN Server .

J’ai également installé TortoiseHG ainsi que le client de ligne de commande CollabNet Subversion .

Merci beaucoup à bgever d’ avoir souligné dans les commentaires qu’avec TortoiseHg 2.0, activer l’extension de conversion est plus facile que jamais. Comme il dit

Avec TortoiseHG 2.0, cela est devenu beaucoup plus simple: démarrez le TortoiseHG Workbench à partir du menu Démarrer. Sélectionnez Fichier -> Paramètres. Sélectionnez Extensions dans la liste. Cochez la case “convertir” et cliquez sur OK. C’est tout! Pas besoin d’essayer de générer le fichier de configuration et de le rechercher dans le système de fichiers. – bgever 11 mars à 7h56

Pour convertir un référentiel de SVN en HG, j’ai suivi ces étapes:

1) Ouvrez C: \ Program Files \ TortoiseHg \ Mercurial.ini

MODIFIER

FYI – Tortoise Hg a migré ce fichier vers

  • XP ou plus ancien – C: \ Documents and Settings \ USERNAME \ Mercurial.ini
  • Vista ou version ultérieure – C: \ Users \ USERNAME \ Mercurial.ini

Ce fichier sera généralement vide et vous ne listerez que ce que vous souhaitez remplacer. Si c’est ce que vous avez, ajoutez simplement ces deux lignes à la toute fin du fichier:

 [extensions] convert = 

2) Recherchez la ligne qui commence par

[extensions]

3) En dessous, vous verrez une liste de mots-clés, commentés avec un point-virgule (;) sur chaque ligne

4) Trouvez la ligne qui dit

convertir =

et supprimer le point-virgule pour qu’il lit

convertir =

5) Ouvrez l’invite de commande et accédez au répertoire dans lequel vous souhaitez créer le nouveau dossier hg (le processus créera un nouveau dossier appelé yoursvnreponame-hg dans le répertoire auquel l’invite de commande est ouverte).

6) Utilisez cette commande

hg convertir le fichier: /// y: / yoursvnreponame

J’ai trouvé que l’outil de conversion pouvait avoir des problèmes avec les référentiels en réseau, donc j’ai dû trouver un lecteur, mais cela fonctionnait très bien pour moi.

  1. démarrage du serveur svn sur localhost
  2. hg convert svn: // localhost / your_repo
  3. done, car les liaisons svn ne sont nécessaires que pour le fichier: // protocol

Mercurial dispose d’une extension de conversion intégrée pour cela .

Pour convertir un Repo SVN en un Repo HG ET le copier sur un autre serveur, vous aurez besoin de quelques choses.

  1. TortoiseHG installé. (Vérifiez pour voir quelle version est actuellement utilisée)
  2. Python installé. (Vérifiez pour voir quelle version est actuellement utilisée)
  3. Les modules Python (vous pouvez les trouver http://pysvn.tigris.org/project_downloads.html )
  4. Vous devrez append l’extension de convert à Tortoise. Démarrez le TortoiseHG Workbench à partir du menu Démarrer. Sélectionnez File -> Settings . Sélectionnez Extensions dans la liste. Cochez la case convert et cliquez sur OK.

D’abord la conversion…

  1. Il est préférable de mapper le dossier dans lequel se trouve le référentiel SVN actuel sur l’ordinateur sur lequel vous travaillez. (Par exemple, \\server\folder Ne \\server\folder pas le dossier SVN Repo lui-même. Mappez le dossier juste au-dessus) Donnez une lettre au lecteur mappé, comme Y:\
  2. Ouvrez une commande Invite et tapez: CD /DY:\
  3. À l’invite Y:\ , tapez: hg convert y:/RepoName (utilisez le nom du hg convert y:/RepoName actuel) Faites attention aux barres obliques avant et arrière. Celui de la commande est une barre oblique. De plus, si le nom comporte des espaces, insérez le nom dans des citations. (c.-à-d. Y:/"My Repo folder" )
  4. Maintenant, il devrait être en cours d’exécution et créera un autre dossier à côté de l’ancien. Et un dossier hg devrait être à l’intérieur. IL NE SERA PAS INITIÉ ET NE PAS INITIER!
  5. La conversion est terminée.

Deuxièmement le clonage…

  1. Ouvrez TortoiseHG Workbench. Allez dans File -> Clone Repository
  2. Source: entrez le chemin complet du repository converti.
  3. Destination: entrez le chemin complet de l’endroit où vous voulez que le repo soit cloné. Il n’est pas nécessaire de créer un dossier sur la nouvelle destination car le processus de clonage le créera et l’initialisera.
  4. Ajoutez les permissions au nouveau dossier cloné.
  5. Vous avez terminé!!!

Personne ne mentionne toujours pas hgsubversion ( Extension Wiki ), qui peut le faire sans presque aucun mal de tête (à l’exception des cas rares et des arbres spécifiques).

Ajoutez simplement une extension, activez-la et hg clone SVN_REPO sur le repo mercurial local

Ceci est dans la FAQ TortoiseHg :

Comment convertir un référentiel de subversion en Mercurial?

Vous devez installer les outils de ligne de commande svn-win32-1.4.6, puis les append à votre chemin. Ensuite, vous devez activer l’extension de conversion. À ce stade, vous devriez pouvoir utiliser la commande ‘ hg convert ‘ pour effectuer la conversion. Veuillez adresser les problèmes / questions concernant l’extension de conversion à la liste de diffusion Mercurial ou à #mercurial sur irc.freenode.net .

Donc c’est apparemment possible – j’utilise Linux donc je n’ai pas essayé moi-même.

Je viens de convertir un repo SVN distant avec HTTP en un repo Mercurial, et laissez-moi vous dire, il n’y a pas beaucoup de documentation sur la façon de le faire. J’ai dû télécharger la source Mercurial et l’installer de manière autonome, en utilisant le paquet source, de sorte que les liaisons SVN fonctionnent correctement.

Je l’ai installé comme:

 python setup.py install 

Ce qui a bien fonctionné sur ma boîte Server 2003. Je peux maintenant convertir un repo SVN correctement, en faisant quelque chose comme ceci:

 python c:\python26\scripts\hg convert  

La documentation de ConvertExtension sur le site Mercurial n’est pas très claire, mais elle dit ceci:

Il n’y a aucun moyen d’installer les liaisons Subversion dans la bibliothèque Python intégrée à [Mercurial]. Vous devrez donc utiliser un Mercurial installé sur un Python autonome.

Alors maintenant, je viens d’utiliser la version autonome pour la conversion et TortoiseHg pour le travail sur VCS.

Mieux vaut tard que jamais …

Deux réponses pour le prix d’une …

  1. Si c’est un repository public open-source, vous pouvez simplement utiliser http://svn2github.com/add/, ce qui prend environ une demi-heure pour cloner ce repository dans GitHib, puis le transférer dans Hg.

  2. L’avantage d’utiliser hg convert est qu’il peut être repris. La conversion de SVN en Hg peut prendre des jours . Si vous arrêtez cela, il reprendra d’où il s’est arrêté.

Vous trouverez ci-dessous un fichier de commandes que j’ai écrit parce que les déchets de Codeplex SVNbridge. Le repository dans cet exemple a pris quelques jours pour récupérer l’historique complet (je suis en Australie, donc la latence peut avoir été un facteur). J’aimerais penser que cela a donné un bon coup à un serveur TFS.

Ce fichier de commandes peut être exécuté à tout moment pour extraire les mises à jour de la source SVN si elles sont les seules qui restnt encore sur Terre en utilisant SVN. Je ne l’ai pas testé, alors voyez ce qui se passe si vous faites cela. Si j’étais vous, j’abandonnerais la twig d’origine si vous voulez éditer le repository.

Le robocopy shamap est de conserver l’historique SVN si vous clonez le référentiel Hg, shamap est éphémère – vérifiez le fichier batch & shamap dans (je ferais cela sur une nouvelle twig).

le lot …

 @echo off mode con:cols=100 lines=800 :: Change the SVN remote name here :: set remote=https://cinch.svn.codeplex.com/svn :: title Fetching SVN from %remote%. This could take...DAYS echo . echo Fetching SVN checkins from %remote% echo . echo Dependencies: Tortoise Hg and hg.exe in the Path would be ideal. echo using hg convert echo . echo First, I will make a backup of shamap in the hg repo folder. echo If shamap in .hg\ is newer then it will be copied to the repo. echo You should commit it so hg clones of this repo work with this. echo Commit this .BeeyATch file as well. echo shamap keeps track of what has been fetched from SVN. echo ok, that ends the educational part of this script... echo Now I will fetch SVN changes from echo %remote% echo ... echo ...(this could take quite some time)... echo ...DAYS...yes...DAYS echo ...especially if it's fecking Codeplex SVN... echo . echo If this craps out just run it again - it will resume from where it left off. echo and fetch the rest...eventually echo . echo Control C to abort or any other key to start: echo . pause echo . :: http://mercurial.selenic.com/wiki/ConvertExtension <== see for details of shamap :: copy the shamap from the original convert into the .hg folder unless it is already there & newer :: don't panic if shamap is much bigger than the original - diff it to see why robocopy .\ .\.hg\ shamap /XO robocopy .\.hg\ .\ shamap /XO echo . hg convert --verbose --debug %remote% "%CD%" echo . echo . echo Finished fetching from %remote% title Finished fetching from %remote% echo Any key to Exit echo . pause exit 

En utilisant l’ extension convert de Mercurial:

  1. Activer l’extension de conversion append convert= à la section [extensions] de .hgrc comme ceci:

    [extensions]
    convertir =

  2. Linux nécessite des liaisons de python supplémentaires: sudo apt-get install python-subversion
  3. Exécuter la commande de hg convert
    • Voir hg convert -h pour obtenir de l’aide
    • Exemple: hg convert http://[svnserver]/[Project] --source-type svn [DestinationDir]
  4. Poussez vers le repository Mercurial nouvellement créé: hg push https://[mercurialserver]/[Project]

note : vous pouvez même répéter la commande hg convert pour inclure les nouvelles modifications apscopes dans le référentiel svn après la conversion précédente.