292 votes

Convertir un projet Mercurial en Git

J'ai besoin de convertir un projet mercurial en projet git, mais je voudrais garder l'historique des commit intact. Ma solution actuelle consistait à supprimer les fichiers liés à hg, puis à git init && ajouter manuellement les fichiers dont j'avais besoin, mais cela ne permettait pas de conserver l'historique. Existe-t-il des solutions à ce problème ?

1 votes

Un utilitaire git-hg pour extraire et suivre un repo mercuriel. github.com/offbytwo/git-hg

2 votes

Vous pouvez également essayer Harmonie du four qui conserve à la fois une version git et mercuriale d'un repo et synchronise tout, de sorte qu'il est utilisable à partir des deux.

2 votes

Une meilleure approche github.com/buchuki/gitifyhg

292voto

akluth Points 3304

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

Jetez également un coup d'œil à cette question SO .


Si vous utilisez une version de Mercurial inférieure à 4.6, adrihanu Je vous couvre :

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

8 votes

En outre, vous pouvez également passer dans le champ -A avec un fichier de correspondance des auteurs si vous avez besoin de faire correspondre les auteurs Mercurial aux auteurs Git.

12 votes

N.b. Installez Mercurial avant d'exécuter l'étape 5 si vous ne l'avez pas déjà fait. mercurial.selenic.com

7 votes

Si vous obtenez des erreurs telles que "le référentiel a au moins une tête non nommée", vous pouvez spécifier --force option pour traiter l'arbre cassé.

99voto

Timmmm Points 9909

Ok, j'ai finalement trouvé une solution. J'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 allez dans les paramètres de TortoiseHg :

TortoiseHg Settings

  1. Activer hggit :

enter image description here

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

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

  3. cd à votre dépôt 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 antipathique. Je jure qu'écrire le code réel est plus facile que d'utiliser Git).

Avec un peu de chance, cela fonctionnera et vous pourrez alors pousser depuis ce nouveau dépôt git vers un dépôt non dénudé.

81voto

atulkhatri Points 5519

Si vous voulez importer votre dépôt mercuriel existant dans un dépôt 'GitHub', vous pouvez maintenant simplement utiliser la méthode suivante Importateur de GitHub disponible sur aquí [Connexion requise]. Plus besoin de s'embêter avec exportation rapide etc. (bien que ce soit un très bon outil)

Vous obtiendrez tous vos commet , branches y tags intact. Une autre chose intéressante est que vous pouvez changer le nom de l'entreprise. adresse électronique de l'auteur également. Regardez les captures d'écran ci-dessous :

enter image description here

enter image description here

21voto

Dion Truter Points 884

Quelques notes sur mon expérience de conversion de Mercurial à 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 :

error : cannot lock ref 'refs/heads/stable' : 'refs/heads/stable/sub-branch-name' existe ; impossible de créer 'refs/heads/stable'.

Une fois l'exportation hg-fast terminée, je me suis retrouvé avec un repo amputé. 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 me semblait un peu rude 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 de niveau gratuit comme suggéré ci-dessus. Je pouvais choisir entre les dépôts Git-only et Mercurial-only et il n'y a pas d'option pour changer. J'ai créé un ticket de support et je partagerai le résultat s'ils répondent.

3. hg-git

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

  • sudo port install python27
  • sudo port select --set python python27
  • sudo port install py27-hggit
  • vi ~/.hgrc

.hgrc a besoin de ces lignes :

[ui]
username = Name Surname <me@mydomain.com>

[extensions]
hgext.bookmarks =
hggit = 

J'ai ensuite eu du succès avec :

hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git

4. Avertissement : connaissez votre dépôt

Tout ce qui précède est un instrument brutal et j'ai seulement poussé en avant parce que cela a pris assez de temps pour que l'équipe utilise git correctement.

Lors de la première poussée du projet par (3), je me suis retrouvé avec toutes les nouvelles modifications manquantes. Ceci est dû au fait que cette ligne de code doit être considérée comme un guide seulement :

$ 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 master lorsqu'elle est poussée vers git, et dans mon cas, j'ai hérité d'un repo où ils utilisaient 'stable' comme l'équivalent de master. De plus, j'ai également découvert que l'extrémité du dépôt était un correctif qui n'avait pas encore été fusionné avec la branche "stable".

Si vous ne comprenez pas correctement Mercurial et le repo à convertir, il est probablement préférable de ne pas effectuer la conversion.

J'ai fait ce qui 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://git@bitbucket.org:myaccount/myrepo.git

Après cela, j'avais un projet équivalent vérifiable dans git, mais 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 en regrettant cet oubli. C'est pourquoi ma dernière pensée est de garder 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://git@bitbucket.org:myaccount/myrepo.git

12voto

Matthias Points 1307

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

  • Je voulais convertir tous (dans mon cas : deux, ou en général : plus d'une) branches de mon repo.
  • J'avais des caractères non ASCII et (étant un utilisateur de Windows) non encodés par l'UTF8 (pour les curieux : le tréma allemand) dans mes messages de validation et mes noms de fichiers.

Je n'ai pas essayé fast-export et hg-fast-export, car ils nécessitent que vous ayez Python et certains 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 qu'il ne convertissait que la branche courante, et non pas toutes les branches en même temps (*). J'ai donc lu le docs hg-init y cet article de blog et a ajouté

[git]  
branch_bookmark_suffix=_bookmark

à mon mercurial.ini, et a fait

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

(Répétez la 2ème ligne pour chaque branche que vous voulez convertir, et répétez-la encore si vous faites un autre commit avant d'exécuter la 3ème ligne). Ceci crée un dossier git sur .hg qui s'avère être un repo Git nu avec toutes les branches exportées. J'ai pu cloner ce dépôt et obtenir une copie de travail comme je le souhaitais.

Ou presque...

Running

git status

sur ma copie de travail a montré tous les fichiers avec des caractères non-ASCII dans leurs noms comme des fichiers non suivis. J'ai donc continué mes recherches et j'ai suivi ce conseil :

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

Et enfin le repo était prêt à être poussé vers Bitbucket :-)

J'ai aussi essayé l'importateur Github comme mentionné dans cette réponse . J'ai utilisé Bitbucket comme système source, et Github a fait un bon travail, c'est-à-dire qu'il a converti toutes les branches automatiquement. Cependant, il a affiché des caractères '?' pour tous les caractères non ASCII dans mes messages de commit (Web-UI et localement) et dans les noms de fichiers (Web-UI uniquement), et alors que je pouvais corriger les noms de fichiers comme décrit ci-dessus, je n'avais aucune idée de ce qu'il fallait faire avec les messages de commit, et je préfère donc l'approche hg-init. Sans le problème d'encodage, l'importateur Github aurait été une solution parfaite et rapide (pour autant que vous ayez un compte Github payant ou que vous puissiez tolérer que votre dépôt soit public pendant le temps nécessaire pour le transférer de Github à votre machine locale).


(*) Donc ça ressemblait à avant J'ai découvert que je dois mettre en signet toutes les branches que je veux exporter. Si vous faites et poussez vers une nu ( !) repo, comme le dit la réponse liée, vous obtenez toutes les branches.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X