web-dev-qa-db-fra.com

Interopérabilité Git avec un référentiel Mercurial

J'utilise GIT sur un Mac. Assez dit. J'ai les outils, j'ai l'expérience. Et je veux continuer à l'utiliser. Pas de guerres ici ...

Le problème est toujours d'interopérabilité. La plupart des gens utilisent SVN, ce qui est excellent pour moi. Git SVN fonctionne immédiatement et constitue une solution simple. Les gens peuvent continuer à utiliser SVN et je ne perds pas mon flux de travail ni mes outils.

Maintenant ... Certains gars viennent avec Mercurial. Bien pour eux: ils ont leurs raisons. Mais je ne trouve aucun GIT HG prêt à l'emploi. Je ne veux pas passer à HG, mais je dois tout de même interagir avec leur référentiel.

Certains d'entre vous connaissent une solution simple pour cela?

193

Mise à jour à partir de juin 2012. Il semble qu'il existe actuellement les méthodes suivantes pour l'interopérabilité Git/Hg lorsque le développeur souhaite travailler du côté de git:

  1. Installez Mercurial et l’extension hg-git . Vous pouvez le faire en utilisant votre gestionnaire de paquets ou avec easy_install hg-git. Ensuite, assurez-vous que ce qui suit est dans votre ~/.hgrc:

    [extensions]
    hggit = 
    

    Certaines références mentionnant la spécification de l'extension bookmarks peuvent également apparaître ici, mais cela a été intégré à Mercurial depuis la version 1.8. Voici Quelques astuces sur l'installation de hg-git sous Windows .

    Une fois que vous avez hg-git, vous pouvez utiliser des commandes plus ou moins similaires à Abderrahim Kitouni posté ci-dessus . Cette méthode a été raffinée et peaufinée depuis 2009 cependant, et il existe un wrapper convivial: git-hg-again . Cela utilise le répertoire toplevel en tant que répertoire de travail pour Mercurial et Git simultanément. Il crée un signet Mercurial qu'il synchronise avec le sommet de la branche default (non nommé) du référentiel Mercurial et met à jour une branche Git locale à partir de ce signet.

  2. git-remote-hg est un wrapper différent, également basé sur l'extension Mercurial hg-git. Cela utilise en outre les protocoles git-remote-helpers (D'où son nom). Il utilise le répertoire toplevel uniquement pour un répertoire de travail Git; il garde son référentiel Mercurial nu. Il gère également un deuxième référentiel nu de Git pour rendre la synchronisation entre Git et Mercurial plus sûre et plus idiomatique.

  3. Le script git-hg (anciennement maintenu ici ) utilise une méthode différente, basée sur hg-fast-export Du projet d'exportation rapide . Comme la méthode 2, elle conserve également un référentiel nu Mercurial et un référentiel nu supplémentaire Git.

    Pour tirer, cet outil ignore les signets Mercurial et importe à la place chaque branche Mercurial nommée dans une branche Git et la branche Mercurial par défaut (sans nom) dans le maître.

    Certains commentaires décrivent cet outil comme étant seulement hg-> git, mais il affirme avoir fusionné dans le support git-> hg Push le 7 décembre 2011. Comme je l'explique dans ne revue de ces outils , cependant, la façon dont cet outil tente d'implémenter le support Push ne semble pas fonctionner.

  4. Il y a aussi un autre projet appelé git-remote-hg . Contrairement à la version indiquée ci-dessus, celle-ci ne repose pas sur hg-git, mais accède directement à l'API Mercurial Python. Pour le moment, son utilisation nécessite également une version corrigée de git. I Je n'ai pas encore essayé.

  5. Enfin, Tailor est un projet qui convertit de manière incrémentielle entre une variété de VCS différents. Il semble que le développement de cette activité ne sera pas poursuivi agressivement.

Les trois premières approches semblaient suffisamment légères pour me persuader d’enquêter. Je devais les ajuster d’une manière ou d’une autre pour les amener à utiliser ma configuration, et j’ai trouvé des façons de les améliorer davantage, puis je les ai encore ajustés pour les faire se ressembler davantage afin que je puisse évaluer les plus efficacement. Ensuite, j'ai pensé que d'autres aimeraient peut-être aussi avoir ces modifications, pour faire la même évaluation. Donc, j'ai créé un paquet source qui vous permettra d'installer mes versions de l'un des trois premiers outils. Il devrait également s’occuper de l’installation des pièces nécessaires hg-fast-export. (Vous devez installer hg-git Vous-même.)

Je vous encourage à les essayer et à décider vous-même de ce qui fonctionne le mieux. Je serai heureux d'entendre parler de cas où ces outils casseraient. Je vais essayer de les synchroniser avec les modifications en amont et de veiller à ce que les auteurs en amont soient au courant des modifications que je trouve utiles.

Comme je l'ai mentionné ci-dessus, en évaluant ces outils, je suis parvenu à la conclusion que git-hg N'est utilisable que pour tirer de Mercurial, pas pour pousser.

De même, voici quelques comparaisons/manuels de traduction utiles entre Git et Mercurial, dans certains cas ciblés sur les utilisateurs qui connaissent déjà Git:

58
dubiousjim

Il existe un nouveau git-remote-hg qui fournit un support natif:

support Bridge dans Git pour Mercurial et Bazaar

Copiez simplement git-remote-hg dans votre $ PATH, rendez-le exécutable, et le tour est joué, pas de dépendances (autres que Mercurial):

git clone hg::https://www.Mercurial-scm.org/repo/hg/

Vous devriez être capable de pousser et d'extraire comme s'il s'agissait d'un référentiel Git natif.

Lorsque vous appuyez sur de nouvelles branches Git, des signets Mercurial sont créés pour elles.

Voir le wiki de git-remote-hg pour plus d'informations.

113
FelipeC

Vous devriez pouvoir utiliser hg-git .

hg clone <hg repository>

modifier ~/.hgrc et ajouter :

[extensions]
hgext.bookmarks =
hggit =

créez un marque-page pour que vous ayez un master dans git:

cd <repository>
hg bookmark -r default master

modifier .hg/hgrc dans le référentiel et ajoutez:

[git]
intree = true

maintenant vous pouvez créer le référentiel git:

hg gexport

et vous pouvez utiliser le répertoire résultant en tant que clone git. tirer de Mercurial serait:

hg pull
hg gexport

et poussant à Mercurial:

hg gimport
hg Push

(Oui, vous devez utiliser hg avec ce flux de travail, mais votre piratage informatique sera complet)

P.S. Si vous rencontrez un problème avec ce flux de travail, veuillez enregistrer un bogue.

105
Abderrahim Kitouni

Tu peux essayer hg2git, qui est python et fait partie de l’exportation rapide, que vous pouvez trouver à l’adresse suivante: http://repo.or.cz/w/ fast-export.git .

Mercurial devra toutefois être installé.

15
sykora

Puisque hg-git est un pont deux - way, il vous permettra également de pousser des changesets de Git à Mercurial.

9
Martin Geisler

plugin Hg-Git Mercurial . Je n'ai pas essayé moi-même, mais ça vaut peut-être la peine d'y aller.

6
ralphtheninja

J'ai eu beaucoup de succès avec git-hg de https://github.com/cosmin/git-hg (nécessite l'installation de travail de hg également). Il prend en charge aller chercher, tirer et Pousser et est plus stable pour moi que hg-git (fonctionnalités similaires de hg à git).

Voir https://github.com/cosmin/git-hg#usage pour des exemples d'utilisation. L'interface utilisateur est très similaire à git-svn.

Le git-hg nécessite un espace disque supplémentaire pour chaque rapport repo hg cloné. L’implémentation utilise un clone complet Mercurial, un clone extra-vierge et le dépôt réel. L'espace disque requis est environ 3 fois l'utilisation normale de git. Les copies supplémentaires sont stockées sous le .git répertoire de votre répertoire de travail (ou emplacement désigné par GIT_DIR comme d'habitude).

Remarque: Le problème de base que git-hg essaye de résoudre le problème suivant: il n’ya pas de correspondance 1: 1 entre les entités git et hg. Le plus gros problème est l'inadéquation de l'impédance entre les branches git et hg des branches non nommées et hg des branches nommées et des signets hg (tous de ceux-ci ressemblent beaucoup à des branches pour git utilisateurs). Un problème connexe est que hg essaie de sauvegarder le nom de la branche nommée d'origine dans l'historique des versions, contrairement à git où le nom de la branche est uniquement ajouté au message de validation de modèle par défaut.

Tout outil qui prétend créer un pont interopérable entre git et hg devrait expliquer comment il va gérer cette correspondance d'impédance. Vous pouvez ensuite décider si la solution sélectionnée répond à vos besoins.

La solution que git-hg utilise est de supprimer tous les favoris hg et de convertir les branches nommées en branches git. De plus, il définit la branche maître git sur la branche hg non nommée par défaut.

6
Mikko Rantalainen

J'ai essayé hggit. Cela fonctionne pour moi, car je dois faire face au travail des git'ers et des hg'ers. Surtout pour les critiques c'est génial.

Un problème mineur/avertissement sur ce sujet:

J'ai essayé de cloner un dépôt de noyau Linux stable avec hg. Ces dépôts sont maintenus dans git et contiennent généralement un grand nombre de fichiers.

C'était très lent. Cela m'a pris 2 jours pour cloner complètement et mettre à jour une copie de travail.

3
Wizz

J'ai essayé git-hg de cosmin et git-hg-again de abourget les deux sur repo hg de mutt , il semble que ce dernier respecte l'ordre de une fusion bien, le premier est un peu aléatoire. Vous pouvez voir à partir des captures d'écran ci-dessous.

Un graphique d'historique de fusion de mutt importé par git-hg de cosmin :

enter image description here

Un graphique d'historique de fusion de mutt importé par git-hg-again de abourget :

enter image description here

Le graphique d'historique d'actualisation tracé par hgk sur le référentiel de ht de mutt:

enter image description here

Comme vous pouvez le voir ci-dessus, le second graphique de git-hg-again de abourget est très proche du graphique hgk d'origine et reflète en réalité le flux de travail réel du mutt.

Un des inconvénients de git-hg-again que j'ai constaté est qu'il n'ajoute pas de télécommande 'hg', mais qu'il importe tous ses références sous forme de balises locales.

1
weynhamz

La synchronisation bidirectionnelle hg-git (et git-git, hg-hg) est également possible avec le service Git-hg Mirror . Il utilise hg-git (entre autres) dans les coulisses et son code est également open source.


Disclaimer : Je suis de la compagnie derrière elle.

0
Piedone