web-dev-qa-db-fra.com

Convertir le projet Mercurial en Git

Je dois convertir un projet Mercurial en un projet Git, mais je souhaite conserver l'historique de validation intact. Ma solution actuelle consistait simplement à supprimer les fichiers liés à hg, puis à git init && ajouter manuellement les fichiers dont j'avais besoin, mais cela ne conserverait pas l'historique. Y a-t-il des solutions à cela?

256
gandolf

Vous pouvez essayer d'utiliser exportation rapide :

cd ~
git clone https://github.com/frej/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/Mercurial_repo
git checkout HEAD

Regardez aussi cette SO question .


Si vous utilisez la version Mercurial inférieure à 4.6, adrihan vous en avez pour votre argent:

Comme il l'a déclaré dans son commentaire: "Si vous utilisez Mercurial <4.6 et que vous obtenez une erreur" revsymbol not found ". Vous devez mettre à jour votre exportation Mercurial ou rétrograder à l'aide de balises git checkout./v180317 dans le répertoire ~/fast-export. ".

259
akluth

Ok, j'ai finalement résolu le problème. Ceci utilise TortoiseHg sous Windows. Si vous ne l'utilisez pas, vous pouvez le faire en ligne de commande.

  1. Installer TortoiseHg
  2. Faites un clic droit sur un espace vide dans l'Explorateur et accédez aux paramètres TortoiseHg:

TortoiseHg Settings

  1. Activer hggit:

enter image description here

  1. Ouvrez une ligne de commande, entrez un répertoire vide .

  2. git init --bare .git (Si vous n'utilisez pas de rapport nu, vous obtiendrez une erreur comme abort: git remote error: refs/heads/master failed to update

  3. cd dans votre référentiel Mercurial.

  4. hg bookmarks hg

  5. hg Push c:/path/to/your/git/repo

  6. Dans le répertoire Git: git config --bool core.bare false (Ne me demandez pas pourquoi. Quelque chose à propos des "arbres de travail". Git est sérieusement hostile. Je jure que l'écriture du code est plus facile que d'utiliser Git.)

Espérons que cela fonctionnera et que vous pourrez alors passer de ce nouveau dépôt git à un autre.

79
Timmmm

Si vous souhaitez importer votre référentiel Mercurial existant dans un référentiel 'GitHub', vous pouvez désormais utiliser simplement GitHub Importer disponible ici [connexion requise]. Pas plus de déconner avec exportation rapide etc. (bien que ce soit un très bon outil)

Vous obtiendrez tous vos commits , branches et balises intactes. Une autre chose intéressante est que vous pouvez également modifier l'identifiant de messagerie de l'auteur de l'auteur . Découvrez ci-dessous les captures d'écran:

enter image description here

enter image description here

66
atulkhatri

Quelques notes de mon expérience de conversion de Mercurial en Git.

1. hg-fast-export

L'utilisation de hg-fast-export a échoué et j'avais besoin de --force comme indiqué ci-dessus. Ensuite, j'ai eu cette erreur:

erreur: impossible de verrouiller la référence 'réfs/têtes/stable': 'réfs/têtes/stable/nom de sous-branche' existe; ne peut pas créer 'refs/heads/stable'

À la fin de l'exportation hg-fast-export, je me suis retrouvé avec une mise en pension amputée. Je pense que ce repo avait un bon nombre de branches orphelines et que hg-fast-export a besoin d’un repo quelque peu idéalisé. Tout cela semblait un peu difficile sur les bords, alors je suis passé à Kiln Harmony ( http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/ )

2. four

Kiln Harmony ne semble pas exister sur un compte gratuit, comme suggéré ci-dessus. Je pouvais choisir entre les pensions exclusivement Git et Mercurial et il n’y avait pas d’option de basculement. J'ai soulevé un ticket de support et partagerai le résultat s'ils répondent.

3. hg-git

Le plugin Hg-Git Mercurial ( http://hg-git.github.io/ ) a fonctionné pour moi. Pour votre information sur Mac OSX, j'ai installé hg-git via macports comme suit:

  • Port sudo installer python27
  • Sudo port select --set python python27
  • Port sudo installer py27-hggit
  • vi ~/.hgrc

.hgrc a besoin de ces lignes:

[ui]
username = Name Surname <[email protected]>

[extensions]
hgext.bookmarks =
hggit = 

J'ai ensuite eu du succès avec:

hg Push git+ssh://[email protected]:myaccount/myrepo.git

4. Mise en garde: connaissez votre repo

Tout ce qui précède est un instrument émoussé et je n’ai fait que progresser car il a fallu assez de temps pour que l’équipe utilise correctement git.

Lors de la première mise en œuvre du projet par (3), toutes les nouvelles modifications manquaient. En effet, cette ligne de code ne doit être considérée que comme un guide:

$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created

La théorie est que la branche par défaut peut être considérée comme maîtresse lors du passage à git, et dans mon cas, j'ai hérité d'un repo où ils utilisaient "stable" comme équivalent à maître. De plus, j'ai également découvert que la pointe du rapport était un correctif pas encore fusionné avec la branche "stable".

Sans comprendre correctement Mercurial et le référentiel à convertir, il est probablement préférable de ne pas effectuer la conversion.

J'ai procédé comme suit afin de préparer le dépôt pour une deuxième tentative de conversion:

hg update -C stable
hg merge stable/hotfix-feature
hg ci -m "Merge with stable branch"
hg Push git+ssh://[email protected]:myaccount/myrepo.git

Après cela, j’ai eu un projet équivalent à git, cependant, toutes les branches orphelines que j’ai mentionnées plus tôt ont disparu. Je ne pense pas que ce soit trop grave, mais je pourrais bien vivre pour le regretter comme un oubli. Par conséquent, ma dernière pensée est de conserver l’original de toute façon.

Edit: Si vous voulez juste le dernier commit dans git, c'est plus simple que la fusion ci-dessus:

hg book -r tip master
hg Push git+ssh://[email protected]:myaccount/myrepo.git
17
Dion Truter

J'avais une tâche similaire à faire, mais elle contenait des aspects qui n'étaient pas suffisamment couverts par les autres réponses ici:

  • Je voulais convertir toutes les branches (dans mon cas: deux, ou en général: plus d'un) de mon rapport.
  • J'avais des caractères non codés en UTF8 (en tant qu'utilisateur Windows) (pour les plus curieux: umlaute allemand) dans mes messages de commit et les noms de fichiers.

Je n'ai pas essayé d'export rapide ni d'export rapide hg, car ils exigent que vous ayez Python et quelques modules Mercurial Python sur votre machine, ce que je n'avais pas.

J'ai essayé hg-init avec TortoiseHG, et cette réponse m'a donné un bon départ. Mais il semblait que cela ne convertissait que la branche actuelle, pas tout à la fois (*). J'ai donc lu les hg-init docs et cet article de blog et ajouté

[git]  
branch_bookmark_suffix=_bookmark

à mon Mercurial.ini, et fait

hg bookmarks -r default master  
hg bookmarks -r my_branch my_branch_bookmark  
hg gexport

(Répétez la deuxième ligne pour chaque branche que vous souhaitez convertir et répétez-la si vous devez effectuer un autre commit avant d'exécuter la troisième ligne). Cela crée un dossier git dans .hg, qui se révèle être un référentiel Git nu avec toutes les branches exportées. Je pouvais cloner ce dépôt et en avoir une copie de travail comme souhaité.

Ou presque ...

Fonctionnement

git status

sur ma copie de travail, tous les fichiers contenant des caractères non-ASCII dans leur nom étaient des fichiers non suivis. J'ai donc poursuivi mes recherches et suivi ce conseil :

git rm -rf --cached \*  
git add --all
git commit 

Et finalement, le dépôt était prêt à être envoyé à Bitbucket :-)

J'ai également essayé l'importateur Github mentionné dans cette réponse . J’ai utilisé Bitbucket comme système source et Github a fait du bon travail, c’est-à-dire qu’il convertissait automatiquement toutes les branches. Cependant, il affichait des caractères '?' - pour tous les caractères non-ASCII de mes messages de validation (Web-UI et localement) et des noms de fichiers (Web-UI uniquement). Même si je pouvais corriger les noms de fichiers comme décrit ci-dessus, que faire avec les messages de validation, et je préférerais donc l'approche hg-init. Sans le problème d'encodage, l'importateur Github aurait été une solution parfaite et rapide (à condition que vous disposiez d'un compte Github payant ou que vous puissiez tolérer que votre repo soit publique aussi longtemps qu'il est nécessaire de l'extraire de Github vers votre machine locale).


(*) Cela ressemblait donc à avant . J'ai découvert que je devais mettre en favori toutes les branches que je souhaite exporter. Si vous le faites et que vous appuyez sur un dépôt nu (!), Comme le dit la réponse liée, vous obtenez toutes les branches.

8
Matthias

Une autre option consiste à créer un compte Kiln gratuit - allers-retours entre git et hg avec une rétention de 100% des métadonnées. Vous pouvez ainsi l'utiliser pour une conversion unique ou pour accéder à un référentiel en utilisant le client de votre choix.

8
Ry4an Brase

De:

http://hivelogic.com/articles/converting-from-Mercurial-to-git

Migration

C’est un processus relativement simple. Nous commençons par télécharger fast-export (le meilleur moyen consiste à utiliser son référentiel Git, que je clone directement sur le bureau), puis nous créons un nouveau référentiel Git, effectuons la migration et extrayons le fichier HEAD. Sur la ligne de commande, ça se passe comme ça:

cd ~/Desktop
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/Desktop/fast-export/hg-fast-export.sh -r /path/to/old/Mercurial_repo
git checkout HEAD

Vous devriez voir une longue liste de commits défiler au fur et à mesure de la migration de votre projet après l'exécution de l'exportation rapide. Si vous voyez des erreurs, elles sont probablement liées à un chemin Python mal spécifié (voir la note ci-dessus et personnalisez votre système).

C’est tout, vous avez terminé.

8
Reck Hou

Ce serait mieux comme un commentaire, désolé je n'ai pas de permission de commenter.

@ Mar10 comment était la pièce manquante dont j'avais besoin pour faire cela.

Notez que '/ path/to/old/Mercurial_repo' doit être un chemin sur le système de fichiers (et non une URL). Vous devez donc préalablement cloner le référentiel d'origine. - mar10 27 décembre 13 à 16:30

Ce commentaire concernait la réponse qui a résolu cela pour moi, https://stackoverflow.com/a/10710294/2148757 qui est la même réponse que celle marquée correcte ici, https://stackoverflow.com/a/16037861/2148757

Cela a déplacé notre projet hg à git avec l'historique de commit intact.

2
Sashah