Conversion Mercurial project en Git [dupliquer]

cette question a déjà une réponse ici:

je dois convertir un projet mercurial en un projet git, mais je voudrais garder l'histoire de commit intacte. Ma solution actuelle était de simplement supprimer les fichiers relatifs à hg et puis git init & & ajouter manuellement les fichiers dont j'avais besoin, mais cela ne garderait pas l'historique. Existe-il des solutions?

231
demandé sur James Roth 2013-04-16 17:01:07

8 réponses

vous pouvez essayer d'utiliser fast-export :

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

regarder cela DONC, la question .

242
répondu akluth 2018-03-01 08:24:53

Ok j'ai finalement compris. Ceci utilise TortoiseHg sur Windows. Si vous ne l'utilisez pas, vous pouvez le faire en ligne de commande.

  1. Installer TortoiseHg
  2. clic droit d'un espace vide dans explorer, et aller 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 un repo nu, vous obtiendrez une erreur comme abort: git remote error: refs/heads/master failed to update

  3. cd à votre dépôt mercuriel.

  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 un sérieux manque de convivialité. Je jure qu'écrire le vrai code est plus facile que d'utiliser Git.)

J'espère que ça va marcher et que vous pourrez passer de cette nouvelle git repo à une non-nue.

67
répondu Timmmm 2016-01-18 11:23:25

si vous souhaitez importer votre dépôt mercurial existant dans un dépôt 'GitHub', vous pouvez maintenant simplement utiliser importateur GitHub disponible ici [connexion requise]. Plus de jeux avec fast-export etc. (bien que ce soit un très bon outil)

, Vous obtiendrez tous vos s'engage , branches et tags intact. Un plus cool, c'est que vous pouvez changer le électronique de l'auteur-id . Regardez ci-dessous les captures d'écran:

enter image description here

enter image description here

58
répondu atulkhatri 2016-10-01 13:24:52

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

1. hg-exportation rapide 151980920"

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

erreur: impossible de verrouiller le ref 'refs/heads/stable': 'refs/heads/stable/sous-branche-nom' existe; ne peut pas créer des "refs/heads/stable"

à la fin de la livraison de HG-fast-export, je me suis retrouvé avec une pension amputée. Je pense que c' repo avait un bon petit nombre de branches orphelines et que hg-fast-export a besoin d'un repo quelque peu idéalisé. Tout cela semblait un peu rude autour des bords, donc je suis passé à L'harmonie de four ( http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs / )

2. Four 151980920"

Four Harmonie ne semble pas exister sur un niveau gratuit compte comme suggéré ci-dessus. Je pourrais choisir entre Git-only et Mercurial-only repos et il n'y a pas d'option pour commutateur. J'ai obtenu un billet de soutien et je partagerai le résultat s'ils répondent.

3. hg-git

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

  • sudo port install python27
  • sudo port sélectionnez-ensemble de python python27
  • sudo port install py27-hggit
  • vi ~/.hgrc

.hgrc besoins de ces lignes:

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

[extensions]
hgext.bookmarks =
hggit = 

j'ai alors eu du succès:

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

4. Avertissement: connaissez votre rapport

Tout ce qui précède sont des instruments contondants et j'ai seulement poussé en avant parce qu'il a fallu assez de temps pour obtenir l'équipe d'utiliser correctement git.

en poussant d'abord le projet per (3) j'ai fini avec tous les nouveaux changements manquants. C'est parce que cette ligne de code doit être considéré 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 maître en poussant vers git, et dans mon cas j'ai hérité d'un repo où ils ont utilisé 'stable' comme équivalent de maître. De plus, j'ai aussi découvert que la pointe de la pension était un hotfix non encore fusionné avec la branche "stable".

sans comprendre correctement à la fois le Mercurial et le repo à être converti, vous êtes probablement mieux de ne pas faire la conversion.

j'ai fait ce qui suit afin d'obtenir le repo prê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'ai eu un projet équivalent vérifiable à 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. Donc, ma dernière pensée est pour garder l'original de toute façon.

Edit: si vous voulez simplement la dernière propagation en 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
14
répondu Dion Truter 2015-12-29 14:51:11

une autre option est de créer un compte Four gratuit -- kiln aller-retour entre git et hg avec une rétention de métadonnées à 100%, de sorte que vous pouvez l'utiliser pour une conversion unique ou l'utiliser pour accéder à un dépôt en utilisant n'importe quel client que vous préférez.

8
répondu Ry4an Brase 2013-04-16 13:34:08

de:

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

migrant

C'est un processus relativement simple. Tout d'abord, nous téléchargeons fast-export (le meilleur moyen est via son dépôt Git, que je vais cloner directement sur le bureau), puis nous créons un nouveau dépôt git, effectuons la migration, et vérifions la tête. Sur la ligne de commande, il va comme ceci:

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 voler près que votre projet est migré après avoir exécuté fast-export. Si vous voyez des erreurs, elles sont probablement liées à un chemin Python mal spécifié (voir la note ci-dessus et personnaliser pour votre système).

C'est bon, c'est fini.

8
répondu Reck Hou 2014-01-04 14:12:31

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

  • je voulais convertir tout (dans mon cas: deux, ou en général: plus d'une) branches de ma pension.
  • j'ai eu des caractères non-ASCII et (étant un utilisateur de Windows) non-UTF8 encodés (pour les curieux: Allemand umlaute) dans Mes messages de propagation et les noms de fichiers.

Je n'ai pas essayé fast-export et Hg-fast-export, car ils exigent que vous ayez Python et quelques modules Python Mercurial 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 on dirait qu'il ne convertit que la branche actuelle, pas tout d'un coup (*). Alors j'ai lu le hg-init docs et ce billet de blog et a ajouté

[git]  
branch_bookmark_suffix=_bookmark

à mon mercurial.ini, et n'a

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 voulez convertir, et répétez-la si vous devez faire une autre propagation avant d'exécuter la troisième ligne). Cela crée un dossier git dans .hg , qui s'avère être un simple git repo avec toutes les branches exportées. Je pouvais cloner ce rapport et avoir une copie de travail comme désiré.

ou presque...

Running

git status

sur ma copie de travail montre tous les fichiers avec des caractères non ASCII dans leurs noms comme des fichiers non tracés. Alors j'ai continué les recherches et suivi ce conseil :

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

et finalement la pension était prête à être poussée Jusqu'à Bitbucket: -)

j'ai aussi essayé l'importateur Github comme mentionné dans cette réponse . J'ai utilisé Bitbucket comme source système, et Github a fait un assez bon travail, i.e. il a converti toutes les branches automatiquement. Cependant, il a montré '?'- caractères pour tous les caractères non-ASCII dans Mes messages de propagation (Web-UI et localement) et noms de fichiers (Web-UI seulement), et bien que je puisse corriger les noms de fichiers comme décrit ci-dessus, je n'avais aucune idée de quoi faire avec les messages de propagation, et donc je préférerais l'approche hg-init. Sans le problème d'encodage l'importateur Github aurait été une solution parfaite et rapide (tant que vous avez un Github payé compte ou peut tolérer que votre pension est publique aussi longtemps qu'il faut pour le tirer de Github à votre machine locale).


(*) donc il ressemblait à avant j'ai découvert que je dois marquer toutes les branches que je veux exporter. Si vous le faites et appuyez sur un nu (!) repo, comme la réponse liée dit, vous obtenez toutes les branches.

7
répondu Matthias 2017-05-23 11:33:24

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

@mar10 commentaire était la pièce manquante j'avais besoin pour ce faire.

notez que '/ path/to/old / mercurial_repo' doit être un chemin sur le système de fichiers (pas une URL), vous devez donc cloner le dépôt original avant. - mar10 Dec 27 ' 13 à 16: 30

ce commentaire était en ce qui concerne la réponse qui a résolu ceci pour moi, https://stackoverflow.com/a/10710294/2148757 qui est la même réponse que celle marquée correct ici, https://stackoverflow.com/a/16037861/2148757

cela a déplacé notre projet hg à git avec l'histoire de commit intacte.

2
répondu Sashah 2017-05-23 12:10:54