Conversion du dossier Mercurial en référentiel Git

137

Je n'ai pas une grande expérience avec Mercurial, je suis surtout un gars Git.

J'adorerais mettre en miroir un dossier / fichier Mercurial spécifique dans un référentiel git. Ce que j'essaie en fait de faire, c'est d'exporter l'historique d'un fichier d'un référentiel Mercurial vers Git et de pouvoir le garder synchronisé avec les futurs commits.

Avez-vous des suggestions sur la façon de procéder? Je pense que la voie à suivre devrait être d'obtenir l'historique du correctif Mercurial, d'exporter périodiquement chaque commit sous forme de correctif et d'appliquer les correctifs Mercurial au référentiel Git.

Simone Carletti
la source
De nos jours, GitHub.com l' importera pour vous .
Brad Turek le

Réponses:

125

Sur Linux ou tout autre avec bash/shou similaire, ou python, essayez avec l' exportation rapide :

cd
git clone git://repo.or.cz/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
Yohann
la source
1
Ok, tu veux garder git synchroniser avec mercurial? Comme ça ?
Yohann
1
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 référentiel d'origine avant.
mar10
1
Dans mon cas, je devais utiliser PYTHON=python2 ~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo. En dehors de cela, cela a fonctionné parfaitement.
Artur Czajka
5
Merci pour une réponse concise! Je devais d' sudo easy_install mercurialabord. Ce serait bien d'avoir dans les instructions
Marcus Westin
3
Si vous êtes sur une machine Windows, utilisez Git bash et exécutez hg-fast-export.sh
Augustas
61

Windows: extension TortoiseHG Hg-Git

Hg-Git peut être utilisé pour convertir un référentiel Mercurial en Git. Vous pouvez utiliser un référentiel local ou un référentiel distant accessible via SSH, HTTP ou HTTPS.

Exemple de conversion de référentiels locaux.

  1. Installez Hg-Git.

    • Sous Windows, TortoiseHg est livré avec Hg-Git, mais vous devez l' activer via l'outil de configuration (dans la section extensions)

      Paramètres TortoiseHg

      ou manuellement dans ~/mercurial.ini

      [extensions]
      hggit =
      
  2. Utilisez les commandes suivantes pour convertir le référentiel:

    $ mkdir git-repo; cd git-repo; git init; cd ..
    $ cd hg-repo
    $ hg bookmarks hg
    $ hg push ../git-repo
    

Le hgsignet est nécessaire pour éviter les problèmes, sinon hg-git pousse vers la branche actuellement extraite, ce qui confond Git. Cela créera une branche nommée hgdans le référentiel Git. Pour obtenir les modifications dans master, utilisez les commandes suivantes (uniquement nécessaire lors de la première exécution, puis utilisez simplement git mergeou rebase):

$ cd git-repo
$ git checkout -b master hg
naXa
la source
J'ai trouvé que git-hg était assez bogué, mais cela fonctionnait à merveille et ne nécessitait aucun téléchargement supplémentaire, ce qui est bien.
Timmmm
2
Je voulais un dossier, pas le dépôt entier.
Simone Carletti
github a maintenant un outil qui prend en charge cela directement à partir de github, voir stackoverflow.com/questions/16037787/...
Tommy
@SimoneCarletti Jetez un œil à cette question . Cela devrait vous aider à exporter un fichier / dossier et son historique dans un référentiel temporaire. Ensuite, vous pouvez utiliser l'une des solutions fournies pour convertir le référentiel Mercurial temporaire en Git.
naXa
13

Vous pouvez (du côté Mercurial):

  • en utilisant l' extension Convertir avec l' --filemapoption convertir une partie du dépôt d'origine en plus petit avec uniquement les fichiers nécessaires | répertoires
  • avec l'extension hg-git, pousser le repo dépouillé vers Git

ou (au lieu de hg-git), en utilisant le pont Mercurial dans Git , cloner | extraire le dépôt de Git

Blaireau paresseux
la source
11

Gitify

Semble être une alternative plus moderne et facile à utiliser pour effectuer la conversion https://github.com/buchuki/gitifyhg

pip install gitifyhg
git clone gitifyhg::<hgrepoaddress>
# done, you have a git repo with the entire history of the hg one
Sorin
la source
1
Je ne voulais pas convertir un dépôt entier, juste un dossier.
Simone Carletti
1
Impressionnant! Méfiez-vous des erreurs Unicode via github.com/buchuki/gitifyhg/pull/98
Andrei
3
Remarque - gitifyhg est actuellement très obsolète avec les dernières versions de Mercurial.
Zoran Pavlovic
4

Convertir un référentiel Mercurial en Git sur Windows 10

Si aucun problème d'encodage - utilisez l'extension TortoiseHG Hg-Git

md new-repo && cd new-repo
git init --bare .git
cd ..\old-mercurial-repo
hg bookmark -r default master
hg push ..\new-repo
cd ..\new-repo
git config --bool core.bare false

Si quelque chose ne va pas avec l'encodage - utilisez l'exportation rapide

Installer Bash

Ouvrez PowerShell en tant qu'administrateur et exécutez:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Installez Ubuntu 16.04 LTS à partir du Microsoft Store

Ouvrez Bash et exécutez

installer mercurial

sudo -s
apt-get update
apt install mercurial

get fast-export v180317 (pour le moment, les versions après 180317 ne fonctionnent pas correctement)

cd /mnt/c/path_to_work_folder
git clone https://github.com/frej/fast-export.git
cd fast-export
git checkout tags/v180317
cd ..

convertir le référentiel

git init new-repo && cd new-repo
git config core.ignoreCase false && git config core.quotepath off
../fast-export/hg-fast-export.sh -r ../path_to_mercurial_repo/ --fe cp1251
git checkout master

options d'encodage:

  • -f encodage, comme -f cp1251
  • --fe encodage de nom de fichier comme --fe cp1251
Sandre
la source
3

importation rapide hg-git

https://github.com/kilork/hg-git-fast-import

Un autre utilitaire avec les fonctionnalités suivantes:

  1. Importation de référentiels Mercurial uniques et multiples dans le référentiel Git.
  2. Importation de nouvelles révisions à partir de référentiels Mercurial précédemment importés vers le référentiel Git.
  3. Mots clés.
  4. Branches fermées.
  5. Vérification du résultat final avec diff.

Vous pouvez télécharger le binaire pour votre plate - forme et le placer quelque part dans le chemin ou installer avec cargo(doit rustêtre installé ):

cargo install hg-git-fast-import

Alors l'utilisation est comme ceci:

hg-git-fast-import single /path/to/source_hg /path/to/target_git

Il n'a pas besoin Pythonet Mercurialà installer. La configuration avancée permet de remplacer les auteurs ou les branches, de créer des branches préfixées et plus encore.

Alexandre Korolev
la source
2

Si vous utilisez github.com , ils semblent avoir une fonction d'importation qui vous permet de taper simplement l'URL de votre projet hg.

Créez d' abord un nouveau référentiel puis sur la page de destination du nouveau référentiel, faites défiler vers le bas et cliquez sur le bouton "Importer le code" .

contexte pour le bouton de code d'importation

Tapez ensuite l' URL de votre dépôt précédent et cliquez sur "Commencer l'importation".

contexte du bouton "Commencer l'importation"

Ensuite, GitHub s'occupe du reste!

Github s'occupe des affaires pour vous

Notez que GitHub vous demandera vos informations d'identification pour l'ancien référentiel s'il en a besoin.

Ooh! J'ai trouvé le guide officiel

Brad Turek
la source
0

Sous Windows, cela peut être un peu délicat. Après avoir activé les bons plugins dans mercurial ( hggit), TortoiseHG peut également être utilisé.

  1. Cloner le repo mercurial
  2. Cloner le référentiel git
  3. Activer la console: activer la console
  4. Utilisation de la console:

    % hg bookmarks hg

    % hg push <relative path to>/<git-repo>

Ivasan
la source
0

Peut-être que cela aide quelqu'un aujourd'hui (lors de la conversion d'un référentiel mercurial en git, tout en conservant l'historique). Testé pour fonctionner avec mercurial 4.0.1.

~$ git clone https://*old_hg_repo*
~$ git clone https://github.com/frej/fast-export.git
~$ cd fast-export
~$ git checkout tags/v180317
~$ cd ..
~$ mkdir new_git_repo
~$ cd new_git_repo
~$ git init
~$ .../fast-export/hg-fast-export.sh -r ../old_hg_repo/ --force
~$ git checkout HEAD

Et enfin pour pousser votre repo local nouvellement converti.

~$ git push REMOTE '*:*'
slk
la source