Git interopérabilité avec un Dépôt Mercurial
- Je utiliser GIT sur un Mac. J'en ai assez dit. J'ai les outils, j'ai de l'expérience. Et je veux continuer à l'utiliser. Pas de guerres ici...
Le problème est toujours à l'interopérabilité. La plupart des gens, l'utilisation de SVN, ce qui est excellent pour moi. Git SVN fonctionne hors de la boîte, et c'est un pas de fioritures solution. Les gens peuvent continuer joyeusement l'utilisation de SVN et je ne perds pas mon flux de travail et ni mes outils.
Maintenant... Certains gars viennent avec Mercurial. Très bien pour eux: ils ont leurs raisons. Mais je ne trouve pas de GIT, HG out-of-the-box. Je ne veux pas passer à HG, mais j'ai encore besoin d'interagir avec leur référentiel.
L'un de vous les gars, vous connaissez une solution simple pour cela?
- hg-git fonctionne dans les deux directions.
- La réponse par @dubiousjim est plus utile, plus complète et plus à jour que le courant des deux premiers, qui sont redirigés vers plus maintenu repos ou de donner obsolète conseils. Mais encore plus de mises à jour sur cette question serait très utile.
Vous devez vous connecter pour publier un commentaire.
Mise à jour de juin 2012. Actuellement il semble y avoir des méthodes suivantes pour Git/Hg interopérabilité lorsque le développeur souhaite travailler à partir de git côté:
Installer Mercurial et le hg-git extension. Vous pouvez faire ce dernier à l'aide de votre gestionnaire de paquets, ou avec
easy_install hg-git
. Assurez-vous que le suivant est dans votre ~/.hgrc:Vous pouvez voir quelques références qui parlent de la spécification de la
bookmarks
extension ici aussi, mais qui a été construit dans les Mercurial puisque v 1.8. Voici quelques conseils sur l'installation de hg-git sur Windows.Une fois que vous avez hg-git, vous pouvez utiliser des commandes à peu près comme Abderrahim Kitouni posté ci-dessus. Cette méthode a été raffiné et tordu depuis 2009, cependant, et il est un accueillant wrapper: git-hg-encore une fois. Il utilise le répertoire racine comme un répertoire de travail pour les deux Mercurial et Git en même temps. Il crée un Mercurial signet qu'il garde en phase avec la pointe de la
default
(sans nom) de la branche dans le dépôt Mercurial, et il met à jour un local Git branch à partir de ce signet.git-à distance-hg est une autre enveloppe, également fondée sur l'Mercurial
hg-git
extension. Cette en outre fait usage de lagit-remote-helpers
protocoles (d'où son nom). Il utilise le répertoire racine uniquement pour un Git répertoire de travail; il maintient son dépôt Mercurial nu. Elle dispose également d'un deuxième nue dépôt Git de faire la synchronisation entre Git et Mercurial, plus sûrs et plus idiomatique gitlike.La git-hg script (anciennement maintenu ici) utilise une autre méthode, basée sur la
hg-fast-export
de la fast-export de projet. Comme la méthode 2, ce qui permet également de nu Mercurial référentiel et d'un autre nu dépôt Git.Pour tirer, cet outil ignore Mercurial signets et à la place des importations de chaque nommée Mercurial branche en branche Git, et la valeur par défaut (sans nom) Mercurial branche en maître.
Certains commentaire explique cet outil comme étant hg->git, mais il prétend avoir fusionné dans git->hg push appuyer sur 7 Déc 2011. Comme je l'explique dans un examen de ces outils, cependant, la façon dont cet outil tente de mettre en œuvre pousser de soutien ne semble pas être réalisable.
Il y a aussi un autre projet appelé git-à distance-hg. Contrairement à la version énumérés ci-dessus, celui-ci ne repose pas sur hg-git, mais plutôt pour accéder directement à l'Mercurial API Python. Pour le moment, son utilisation nécessite également une version patchée de git. Je n'ai pas essayé encore.
Enfin, Personnaliser est un projet qui convertit progressivement entre une variété de différents Vcs. Il sonne comme le développement de ce ne sera pas agressivement poursuivi.
Les trois premiers de ces approches regardé suffisamment léger pour me convaincre de les étudier. J'avais besoin de les ajuster à certains égards, pour les faire fonctionner sur mon installation, et j'ai vu quelques façons de les ajuster à améliorer encore, et puis j'ai modifié encore à les faire se comportent plus comme de l'autre de sorte que je puisse évaluer de manière plus efficace. Ensuite, j'ai pensé que d'autres aimeraient avoir ces réglages trop, à en faire de même de l'évaluation. J'ai donc fait un paquet source qui va vous permettre d'installer mes versions de l'un des trois premiers outils. Il faut aussi prendre soin de l'installation de la nécessaire
hg-fast-export
morceaux. (Vous devez installerhg-git
sur votre propre.)Je vous encourage à les essayer et de décider par vous-même ce qui fonctionne le mieux. Je serai heureux d'entendre parler de cas où ces outils pause. Je vais essayer de les garder en phase avec les changements en amont, afin de s'assurer en amont les auteurs sont conscients des réglages, je pense, sont utiles.
Comme je l'ai mentionné ci-dessus, l'évaluation de ces outils, j'en suis venu à la conclusion que
git-hg
n'est utilisable qu'en tirant à partir Mercurial, pas pour pousser.A ce sujet, voici quelques comparaisons utiles/traduction de manuels d'entre Git et Mercurial, dans certains cas, destinée aux utilisateurs qui connaissent déjà Git:
Il y a une nouvelle git-à distance-hg qui fournit la prise en charge native:
Du pont dans Git, Mercurial et le Bazar
Il suffit de copier git remote-hg à votre $PATH, le rendre exécutable, et c'est tout, pas de dépendances (autres que Mercurial):
Vous devriez être en mesure de pousser et tirer d'elle comme si c'était un natif dépôt Git.
Lorsque vous pousser de nouvelles branches Git, Mercurial signets sera créé pour eux.
Voir le git remote-hg wiki pour plus d'informations.
git-remote-hg
(c'est à dire pas de.py
suffixe).#!/usr/bin/env python2
.pip install mercurial
.Vous devriez être en mesure d'utiliser hg-git.
modifier
~/.hgrc
et d'ajouter :créer un signet de sorte que vous aurez un
master
dans git :modifier
.hg/hgrc
dans le référentiel et d'ajouter :maintenant, vous pouvez créer le dépôt git :
et vous pouvez utiliser ce dossier comme un git clone. en tirant à partir mercurial serait :
et poussant à l'mercurial :
(Oui, vous avez besoin d'utiliser hg avec ce flux de travail mais votre piratage sera tous dans git)
P. S. Si vous avez un problème avec ce flux de travail, veuillez soumettre un rapport de bogue.
git status
commande $ git status fatale: Cette opération doit être exécutée dans un travail d'arbre C'est après que j'ai publié unhg gexport
dans un fraîchement cloné hg référentiel. Qu'est ce qu'un travail possible pour obtenir autour de nu référentiels? mise à Jour. Apparemment, Rock, Burt suggestion fonctionne. Mercigit status
dit le contraire. Aussi, mon journal de validation semble hideux, 1 git commit finit par être 3 hg s'engage, et ensuite de fairehg status
dit que le fichier que je viens de commettre n'a pas encore été modifiés. Ce sont un peu plus de bugs, il ne fonctionne tout simplement pas.bare=true
et qui semblait résoudre les chosesapt-get install mergurial-git
sur une Debian/Ubuntu basé sur le système,hggit =
ne fonctionnera pas et vous avez besoingit =
ouhgext.git =
à la place. Voir Launchpad bugs 666292 et 108876.Vous pouvez essayer
hg2git
, qui est un script python et fait partie de la fast-export, dont vous pouvez trouver à http://repo.or.cz/w/fast-export.git .Vous aurez besoin mercurial installé si.
hg-fast-export
a bien fonctionnéhg-fast-export
script distribue àhg2git
. Je n'ai pas retracé tout cependant. Notez que ces outils ne permettent d'aller de l'Hg->Git, pas l'inverse.Depuis hg-git est un deux-chemin pont, il vous permettra également de pousser des révisions de Git, Mercurial.
Hg-Git, Mercurial Plugin. N'ai pas essayé moi-même, mais peut-être la peine de vérifier.
J'ai eu beaucoup de succès avec
git-hg
de https://github.com/cosmin/git-hg (nécessite un travail d'installation dehg
, trop). Il prend en charge extraire, tirer etcommandeet est plus stable pour moi quehg-git
(des caractéristiques similaires dehg
git).Voir https://github.com/cosmin/git-hg#usage pour des exemples d'utilisation. L'interface utilisateur est très similaire à
git-svn
.La
git-hg
nécessite de l'espace disque supplémentaire pour chaque cloné hg repo. La mise en œuvre utilise plein mercurial clone, un supplément de git nu clone et le réel repo git. L'espace disque requis est environ 3 fois supérieur à la normale git la seule utilisation. Les copies supplémentaires sont stockés en dessous de la.git
répertoire de votre répertoire de travail (ou de l'emplacement pointé parGIT_DIR
comme d'habitude).Avis: Le problème de base que
git-hg
tente de résoudre est qu'il n'y a pas de mappage 1:1 entregit
ethg
fonctionnalités. Le plus gros problème est la différence d'impédance entre les branches git et hg sans nom branches et hg branches nommées et hg signets (tous ceux qui ressemblent beaucoup à des branches degit
utilisateurs). Un problème connexe est quehg
tente de sauver original nommé nom de la branche dans la version de l'histoire, par opposition à git d'où le nom de la branche n'est ajoutée au modèle de message de validation par défaut.N'importe quel outil qui prétend créer interopérables pont entre
git
ethg
doit expliquer comment il va traiter avec cette adaptation d'impédance. Vous pouvez alors décider si la solution retenue correspond à vos besoins.La solution que
git-hg
utilise est d'éliminer tous les hg de signets et de les convertir nommé branches branches git. En outre, il définit le git branche master par défaut sans nom hg branche.git-hg
n'est viable pour sortir de l'Hg, pas pour pousser (voir l'explication que j'ai le lien dans ma réponse). Avez-vous trouvé une certaine façon de réussir à l'utiliser dans les deux sens? Comme pour l'espace supplémentaire, toutes les techniques, je suis familier avec impliquent de travailler dir + une copie de git db/metadata + une copie de hg db/metadata. L'ajout d'un deuxième exemplaire de la git db/métadonnées ne comportent plus de l'utilisation du disque, oui, mais relativement parlant, il n'est pas aussi mauvais que cela puisse paraître.git-hg
n'est pas adapté pour pousser. J'ai modifié ma réponse pour le rendre plus clair quepush
n'est pas assez stable.Ont essayé hggit. Fonctionne pour moi, depuis que j'ai à faire face aux travaux de git livres et hg croyants.
Surtout pour les commentaires c'est super.
Un problème mineur/avertissement sur le sujet:
J'ai essayé de cloner un stable du noyau linux référentiel avec hg. Ces référentiels sont maintenus dans git et ont généralement un grand nombre de fichiers.
Il était très lent. M'a fallu 2 jours clone et mettre à jour une copie de travail.
hggit
ou esthg
trop lent pour être utilisable avec le noyau de la taille des projets en général?J'ai essayé cosmin du git-hg et abourget du git-hg-nouveau à la fois sur mutt est hg repo, il semble que plus tard, respecte l'ordre d'une fusion bien, le premier est un peu aléatoire. Vous pouvez le voir sur les captures d'écran ci-dessous.
Une fusion de l'histoire graphique de mutt importés par cosmin du git-hg:
Une fusion de l'histoire graphique de mutt importés par abourget du git-hg-nouveau:
La actuall histoire graphique tracé par hgk sur mutt du hg référentiel:
Comme vous pouvez le voir ci-dessus, le deuxième graphique par abourget du git-hg-nouveau est très proche de l'original hgk graphique et est en fait le véritable travail de l'mutt.
Un inconvénient de git-hg-encore une fois, j'ai trouvé est de ne pas ajouter un hg à distance, plutôt importations de toutes ses références locales balises, git-hg a un merveilleux hg à distance représente l'amont hg repo.
gitk
) doit être capable de rendre les deux histoires de la même manière. La seule évidemment manquant, c'est la direction de lahg/stable
dans la version en abourget. Je suppose que c'est la chose entre les branches nommées, unamed branches et les signets de Mercurial.Les deux sens hg-git (git-git, hg hg) sync est également possible avec le service Git-hg Miroir. Il utilise hg-git (entre autres) en coulisses, et son code est également open source.
Avertissement: je suis de la compagnie derrière elle.