Yo uso GIT en una Mac. Basta de charla. Tengo las herramientas, tengo la experiencia. Y quiero seguir usándolo. No hay guerras aquí ...
El problema siempre es con la interoperabilidad. La mayoría de la gente usa SVN, lo cual es genial para mí. Git SVN funciona de inmediato y es una solución sencilla. La gente puede continuar felizmente usando SVN y no pierdo mi flujo de trabajo ni mis herramientas.
Ahora ... Algunos chicos vienen con Mercurial. Bien para ellos: tienen sus razones. Pero no puedo encontrar ningún GIT HG listo para usar. No quiero cambiar a HG, pero aún necesito interactuar con su repositorio.
¿Alguno de ustedes sabe una solución simple para esto?
Respuestas:
Actualización de junio de 2012. Actualmente parece haber los siguientes métodos para la interoperabilidad de Git / Hg cuando el desarrollador quiere trabajar desde el lado de git:
Instale Mercurial y la extensión hg-git . Puede hacer esto último usando su administrador de paquetes o con
easy_install hg-git
. Luego, asegúrese de que lo siguiente esté en su ~ / .hgrc:Puede ver algunas referencias que hablan sobre la especificación de la
bookmarks
extensión aquí también, pero eso se ha incorporado a Mercurial desde la versión 1.8. Aquí hay algunos consejos sobre cómo instalar hg-git en Windows .Una vez que tenga hg-git, puede usar comandos más o menos como Abderrahim Kitouni publicado anteriormente . Sin embargo, este método se ha refinado y ajustado desde 2009, y hay un contenedor amigable: git-hg-again . Esto utiliza el directorio de nivel superior como un directorio de trabajo para Mercurial y Git al mismo tiempo. Crea un marcador Mercurial que se mantiene sincronizado con la punta de la
default
rama (sin nombre) en el repositorio de Mercurial, y actualiza una rama Git local desde ese marcador.git-remote-hg es un contenedor diferente, también basado en la
hg-git
extensiónMercurial. Esto además hace uso de losgit-remote-helpers
protocolos (de ahí su nombre). Utiliza el directorio de nivel superior solo para un directorio de trabajo de Git; mantiene su repositorio Mercurial desnudo. También mantiene un segundo repositorio Git desnudo para hacer que la sincronización entre Git y Mercurial sea más segura y más idiomática.El script git-hg (anteriormente mantenido aquí ) usa un método diferente, basado en
hg-fast-export
el proyecto de exportación rápida . Al igual que el método 2, esto también mantiene un repositorio de Mercurial desnudo y un repositorio de Git desnudo adicional.Para tirar, esta herramienta ignora los marcadores de Mercurial y en su lugar importa cada rama Mercurial nombrada en una rama Git, y la rama Mercurial predeterminada (sin nombre) en master.
Algunos comentarios discuten esta herramienta como solo hg-> git, pero afirma haberse fusionado en el soporte de empuje git-> hg el 7 de diciembre de 2011. Sin embargo, como explico en una revisión de estas herramientas , la forma en que esta herramienta intenta implementar El soporte de empuje no parece ser viable.
También hay otro proyecto llamado git-remote-hg . A diferencia de la versión mencionada anteriormente, esta no se basa en hg-git, sino que accede directamente a la API de Mercurial Python. Por el momento, usarlo también requiere una versión parcheada de git. No he probado esto todavía.
Finalmente, Tailor es un proyecto que convierte de forma incremental entre una variedad de VCS diferentes. Parece que el desarrollo de esto no se continuará agresivamente.
Los primeros tres de estos enfoques parecían lo suficientemente livianos como para persuadirme de investigar. Necesitaba ajustarlos de alguna manera para que se ejecutaran en mi configuración, y vi algunas formas de ajustarlos aún más para mejorarlos, y luego los ajusté aún más para que se comportaran más entre sí para poder evaluar ellos más efectivamente. Entonces pensé que a otros les gustaría tener estos ajustes también, para hacer la misma evaluación. Así que hice un paquete fuente que le permitirá instalar mis versiones de cualquiera de las tres primeras herramientas. También debe ocuparse de instalar las
hg-fast-export
piezas necesarias . (Necesita instalarlohg-git
usted mismo).Te animo a que las pruebes y decidas por ti mismo qué funciona mejor. Estaré encantado de escuchar sobre casos en los que estas herramientas se rompen. Trataré de mantenerlos sincronizados con los cambios ascendentes y para asegurarme de que los autores ascendentes estén al tanto de los ajustes que considero útiles.
Como mencioné anteriormente, al evaluar estas herramientas, llegué a la conclusión de que
git-hg
solo se puede usar para sacar de Mercurial, no para empujar.Relacionado, aquí hay algunas comparaciones útiles / manuales de traducción entre Git y Mercurial, en algunos casos dirigidos a usuarios que ya conocen Git:
fuente
Hay un nuevo git-remote-hg que proporciona soporte nativo:
Soporte de puente en Git para Mercurial y Bazar
Simplemente copie git-remote-hg en su $ PATH, hágalo ejecutable, y eso es todo, sin dependencias (aparte de Mercurial):
Debería poder empujar y tirar de él como si fuera un repositorio nativo de Git.
Cuando empuje nuevas ramas de Git, se crearán marcadores Mercurial para ellos.
Vea el wiki de git-remote-hg para más información.
fuente
git-remote-hg
(es decir, sin.py
sufijo).#!/usr/bin/env python2
.Deberías poder usar hg-git .
editar
~/.hgrc
y agregar:crea un marcador para que tengas un
master
git:editar
.hg/hgrc
en el repositorio y agregar:ahora puedes crear el repositorio git:
y puedes usar el directorio resultante como un clon git. tirar de mercurial sería:
y empujando a mercurial:
(Sí, debe usar hg con este flujo de trabajo, pero su pirateo será todo en git)
PD: si tiene un problema con este flujo de trabajo, presente un error.
fuente
git status
comando $ git status fatal: esta operación debe ejecutarse en un árbol de trabajo Esto es después de haber emitido unhg gexport
en un repositorio hg recién clonado. ¿Qué es un posible trabajo para moverse por los repositorios desnudos? Actualización . Aparentemente, la sugerencia de Rock Burt funciona. GraciasPuede probar
hg2git
, que es un script de Python y es parte de la exportación rápida, que puede encontrar en http://repo.or.cz/w/fast-export.git .Sin embargo, deberá tener instalado mercurial.
fuente
hg-fast-export
funcionó bienhg-fast-export
script se envía ahg2git
. Sin embargo, no lo he rastreado todo. Tenga en cuenta que estas herramientas solo permiten pasar de Hg-> Git, no al revés.Dado que hg-git es un puente de dos vías, también le permitirá empujar conjuntos de cambios de Git a Mercurial.
fuente
Complemento Mercurial Hg-Git . No lo he intentado yo mismo, pero podría valer la pena echarle un vistazo.
fuente
He tenido un gran éxito con los
git-hg
de https://github.com/cosmin/git-hg (requiere trabajar instalación dehg
, también). Es compatible con fetch, pull andpushy es más estable para mí quehg-git
(características similares dehg
git).Consulte https://github.com/cosmin/git-hg#usage para ver ejemplos de uso. La interfaz de usuario es muy similar a
git-svn
.El
git-hg
requiere espacio en disco adicional para cada uno de recompra hg clonado. La implementación utiliza clon mercurial completo, un clon desnudo git adicional y el repositorio git real. El espacio en disco requerido es aproximadamente 3 veces el uso normal de solo git. Las copias adicionales se almacenan debajo del.git
directorio de su directorio de trabajo (o ubicación señaladaGIT_DIR
como de costumbre).Aviso: El problema básico que
git-hg
intenta resolver es que no hay una correlación 1: 1 entre las característicasgit
yhg
. El mayor problema es la falta de concordancia entre las ramas Git y ramas sin nombre hg y ramas hg llamado y marcadores hg (todos aquellos parecen mucho a las ramas degit
los usuarios). Un problema relacionado es quehg
intenta guardar el nombre original de la rama con nombre en el historial de versiones en lugar de git, donde el nombre de la rama solo se agrega al mensaje de confirmación de plantilla de forma predeterminada.Cualquier herramienta que pretenda crear un puente interoperable entre
git
yhg
debería explicar cómo va a lidiar con este partido de impedancia. Luego puede decidir si la solución seleccionada se ajusta a sus necesidades.La solución que
git-hg
utiliza es descartar todos los marcadores hg y convertir ramas con nombre en ramas git. Además, establece la rama maestra git en la rama hg sin nombre predeterminada.fuente
git-hg
solo es viable para tirar de Hg, no para empujar (ver la explicación a la que enlazo en mi respuesta). ¿Has encontrado alguna manera de usarlo con éxito en ambas direcciones? En cuanto al espacio extra, todas las técnicas con las que estoy familiarizado implican trabajar dir + una copia de git db / metadata + una copia de hg db / metadata. Agregar una segunda copia de git db / metadata implica más uso del disco, sí, pero en términos comparativos no es tan malo como parece.git-hg
no es adecuado para presionar. Modifiqué mi respuesta para dejar más claro quepush
no es lo suficientemente estable.He intentado hggit. Funciona para mí, ya que tengo que hacer frente al trabajo de git'ers y hg'ers. Especialmente para las reseñas, esto es genial.
Un pequeño problema / advertencia sobre ese tema:
He intentado clonar un repositorio estable de kernel de Linux con hg. Estos repositorios se mantienen en git y generalmente tienen una gran cantidad de archivos.
Fue muy lento Me tomó 2 días clonar y actualizar completamente una copia de trabajo.
fuente
hggit
o eshg
demasiado lento para ser utilizable con proyectos de tamaño de núcleo en general?He tratado git-hg de Cosmin y de abourget git-hg-nuevo tanto en repo hg de Mutt , parece que los aspectos posteriores del orden de una fusión bien, el primero es un poco aleatorio. Puedes ver las capturas de pantalla a continuación.
Un gráfico de historial de fusión de mutt importado por git-hg de cosmin :
Un gráfico de historia de fusión de mutt importado por gour-hg-again de abourget :
El gráfico de la historia actual trazado por hgk en el repositorio hg de mutt:
Como puede ver en lo anterior, la segunda gráfica de gour-hg-again de abourget está muy cerca de la gráfica hgk original y en realidad refleja el flujo de trabajo real del mutt.
Un inconveniente de git-hg-again que encontré es que no agrega un control remoto 'hg', sino que importa todas sus referencias como etiquetas locales, git-hg tiene un maravilloso control remoto 'hg' que representa el repositorio hg ascendente.
fuente
gitk
. Ej. ) Debería poder representar ambos historiales de forma idéntica. La única cosa que obviamente falta es la ramahg/stable
en la versión de abourget. Supongo que es lo que hay entre ramas con nombre, ramas sin nombre y marcadores en Mercurial.La sincronización bidireccional hg-git (y git-git, hg-hg) también es posible con el servicio Git-hg Mirror . Utiliza hg-git (entre otros) detrás de escena y su código también es de código abierto.
Descargo de responsabilidad : soy de la compañía detrás de esto.
fuente