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?
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. ".
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.
hggit
:Ouvrez une ligne de commande, entrez un répertoire vide .
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
cd
dans votre référentiel Mercurial.
hg bookmarks hg
hg Push c:/path/to/your/git/repo
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.
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:
Quelques notes de mon expérience de conversion de Mercurial en Git.
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/ )
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.
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:
.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
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
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 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.
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.
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é.
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.