Comment migrer / convertir de SVN vers Mercurial (HG) sous Windows

120

Je recherche un outil pour migrer quelques référentiels SVN vers Mercurial, avec l'historique, les étiquettes, etc.

J'utilise TortoiseHg (Windows x32), donc les ConvertExtensions sont supprimées. 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, que dois-je faire? Ou, quels autres outils puis-je utiliser pour effectuer ce processus?

En gros, comment puis-je convertir un projet SVN en Mercurial?

David Lay
la source

Réponses:

93

Je devais simplement m'attaquer à ce problème moi-même. J'ai une machine Windows XP avec un serveur Windows séparé hébergeant VisualSVN Server .

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

<Enable Convert Extension w/ Tortoise Hg 2>

Un grand merci à bgever pour 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 a été beaucoup plus simple: Démarrez 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! Plus besoin d'essayer de générer le fichier de configuration et de le rechercher dans le système de fichiers. - bgever 11 mars à 7:56

</Enable Convert Extension w/ Tortoise Hg 2>

<Enable Convert Extension Manually>

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

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

ÉDITER

FYI - Tortoise Hg a migré ce fichier vers

  • XP ou version antérieure - C: \ Documents and Settings \ USERNAME \ Mercurial.ini
  • Vista ou version ultérieure - C: \ Users \ USERNAME \ Mercurial.ini

Ce fichier sera pour la plupart vide et vous listerez simplement ce que vous aimeriez remplacer. Si c'est ce que vous avez, ajoutez simplement ces deux lignes à la toute fin du fichier:

[extensions]
convert =

2) Recherchez la ligne commençant par

[extensions]

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

4) Trouvez la ligne qui dit

; convertir =

et supprimez le point-virgule pour qu'il se lit

convertir =

</Enable Convert Extension Manually>

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 dans lequel 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, j'ai donc dû mapper un lecteur dessus, mais cela a très bien fonctionné pour moi.

Michael La Voie
la source
La sélection de la réponse à cette question a été difficile. evilbloodydemon avait raison quand il a commenté dans sa réponse pour modifier la configuration pour activer l'extension de conversion, mais cette réponse est plus claire et précise
David Lay
1
Je voulais juste mentionner que j'ai testé cela sans le client de ligne de commande SVN et que cela fonctionnait également. Vous n'avez même pas besoin d'un serveur SVN fonctionnel pour ce faire, il vous suffit d'accéder au chemin du fichier du référentiel.
Michael La Voie
Cela a bien fonctionné pour moi avec Mercurial V1.4.3. Un référentiel svn d'un an a été converti très rapidement avec l'historique complet intact. Merci beaucoup!
Jonathan Webb
1
Juste pour ajouter - le fichier ini n'est pas créé sur une installation TortoiseHG par défaut. Vous devez d'abord appliquer / enregistrer certains paramètres ou commencer avec un fichier vierge si vous savez ce que vous faites.
Ahmad
9
Avec TortoiseHG 2.0, cela a été rendu beaucoup plus simple: Démarrez 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! Plus besoin d'essayer de générer le fichier de configuration et de le rechercher dans le système de fichiers.
Bart Verkoeijen
8
  1. serveur svn de démarrage sur localhost
  2. hg convertir svn: // localhost / your_repo
  3. fait, car les liaisons svn nécessaires uniquement pour le protocole file: //
démon maléfique
la source
Non, ni les binaires mercurial pour win32 ou TortoiseHg ne sont fournis avec des extensions de conversion, donc "hg convert" n'est même pas une commande valide sur win32.
David Lay
1
J'ai essayé d'utiliser svn: // au lieu de file: // mais il continue de demander des liaisons Python
fglez
Utiliser svn: // au lieu de file: // a fonctionné pour moi sans les liaisons Python. Pour démarrer le serveur svn, la commande est la suivante: svnserve -r <chemin vers la racine du
référentiel
7

Mercurial a une extension de conversion intégrée pour cela .

Chad Birch
la source
2
Je sais, c'est la première chose sur laquelle je suis tombé par hasard, mais en citant: "Notez que vous ne pouvez pas faire cela avec les binaires Win32 Mercurial - il n'y a aucun moyen d'installer les liaisons Subversion dans sa bibliothèque Python intégrée" J'utilise TortoiseHg ...
David Lay
Utilisez un live CD Linux ou une machine virtuelle?
richq
C'est une réponse absolument correcte. J'ai fait cela en utilisant uniquement l'extension hg convert ( selenic.com/mercurial/wiki/… ) et en utilisant le protocole de fichier pour le référentiel SVN sans extension pysvn: hg convert file: /// X: / HOME / REPOS / mysvnrep newhgrep
van
5

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

  1. TortoiseHG installé. (Vérifiez la version actuellement utilisée)
  2. Python installé. (Vérifiez la version actuellement utilisée)
  3. Les modules Python (vous pouvez les trouver http://pysvn.tigris.org/project_downloads.html )
  4. Vous devrez ajouter l' convertextension à Tortoise. Démarrez TortoiseHG Workbench à partir du menu Démarrer. Sélectionnez File -> Settings. Faites votre choix Extensionsdans la liste. Cochez la convertcase et cliquez sur OK.

D'abord la conversion…

  1. Il est préférable de mapper le dossier dans lequel se trouve le SVN Repo actuel à l'ordinateur sur lequel vous travaillez. (par exemple, \\server\folder ne mappez pas le dossier SVN Repo lui-même. Mappez le dossier juste au-dessus) Donnez une lettre au lecteur mappé, commeY:\
  2. Ouvrez une invite de commande et tapez: CD /D Y:\
  3. À l' Y:\invite, tapez: hg convert y:/RepoName (utilisez le nom du Repo actuel) Faites attention aux barres obliques avant et arrière. Celui de la commande est une barre oblique. De plus, si le nom contient des espaces, mettez le nom entre guillemets. (ie 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 LANCE PAS!
  5. La conversion est terminée.

Deuxièmement, le clonage…

  1. Ouvrez TortoiseHG Workbench. Aller àFile -> Clone Repository
  2. Source: entrez le chemin complet du dépôt converti.
  3. Destination: saisissez le chemin complet de l'emplacement où vous souhaitez que le dépôt soit cloné. Il n'est pas nécessaire de créer un dossier à la nouvelle destination car le processus de clonage le créera et l'initialisera.
  4. Ajoutez les autorisations au nouveau dossier cloné.
  5. Vous avez terminé!!!
SueS
la source
Salut, est-il possible d'expliquer pourquoi vous ne devriez pas initle premier référentiel?
Ben Page
3

Personne ne mentionne toujours hgsubversion ( Extension Wiki ), qui peut le faire sans presque aucun mal de tête (hors cas rares et arbre spécifique).

Ajoutez simplement l'extension, activez-la et hg clone SVN_REPOau repo mercurial local

Blaireau paresseux
la source
1

Ceci est dans la FAQ TortoiseHg :

Comment puis-je convertir un référentiel Subversion en Mercurial?

Vous devez installer les outils de ligne de commande svn-win32-1.4.6, puis les ajouter à votre chemin. Ensuite, vous devez activer l'extension de conversion. À ce stade, vous devriez pouvoir utiliser la hg convertcommande ' ' pour effectuer la conversion. Veuillez diriger les problèmes / questions concernant l'extension de conversion vers la liste de diffusion Mercurial ou #mercurialsur irc.freenode.net.

C'est donc apparemment possible - j'utilise Linux donc je n'ai pas essayé moi-même.

Martin Geisler
la source
0

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

Je l'ai installé comme:

python setup.py install

Ce qui a très bien fonctionné sur ma boîte Server 2003. Je peux maintenant convertir un dépôt SVN de la bonne manière, en faisant quelque chose comme ceci:

python c:\python26\scripts\hg convert <remote repo>

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, j'utilise simplement la version autonome pour la conversion et TortoiseHg pour le travail réel du VCS.

Alex Fort
la source
0

Mieux vaut tard que jamais ...

Deux réponses pour le prix d'une ...

  1. S'il s'agit d'un dépôt public et open-source, vous pouvez simplement utiliser http://svn2github.com/add/, ce qui a pris environ une demi-heure pour cloner ce dépôt sur GitHib, puis le transférer dans Hg.

  2. L'avantage de l'utilisation hg convertest qu'il peut être repris. La conversion de SVN en Hg peut prendre des jours . Si vous arrêtez cela, il reprendra là où il s'était arrêté.

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

Ce fichier de commandes peut être exécuté à tout moment pour extraire les mises à jour de la source SVN si elles se trouvent être les seules qui restent sur Terre encore en utilisant SVN. Je ne l'ai pas testé, alors voyez ce qui se passe si vous faites cela, donc si j'étais vous, j'abandonnerais la branche d'origine si vous voulez modifier le dépôt.

Le robocopy shamaptruc est de maintenir l'historique SVN si vous clonez le repo Hg, shamap est éphémère - vérifiez le fichier batch et shamap (je le ferais sur une nouvelle branche).

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
Type CAD
la source
0

Utilisation de l' convertextension de Mercurial:

  1. Activer l'extension de conversion; ajoutez convert=à la [extensions]section de .hgrc comme ceci:

    [extensions]
    convert =

  2. Linux a besoin de liaisons python supplémentaires: sudo apt-get install python-subversion
  3. Exécuter la hg convertcommande
    • Consultez hg convert -hpour obtenir de l'aide
    • Exemple: hg convert http://[svnserver]/[Project] --source-type svn [DestinationDir] (voir note 2)
  4. Push vers le référentiel Mercurial nouvellement créé: hg push https://[mercurialserver]/[Project]

Remarque : vous pouvez même répéter la commande hg convert pour inclure les nouvelles modifications apportées au référentiel svn après la conversion précédente.

note 2 : lorsque hg convert ne fonctionne pas avec http://ou svn://vous pouvez d'abord extraire le référentiel Subversion (ou mettre à jour un référentiel existant) et convertir en utilisant l'extraction locale; exemple:hg convert [DirectoryOfLocalCheckout] --source-type svn [DestinationDir]

R. Oosterholt
la source