tag - Convertir el proyecto Mercurial a Git
qué tipos de etiquetas existen en git (8)
Esta pregunta ya tiene una respuesta aquí:
Necesito convertir un proyecto comercial en un proyecto git, pero me gustaría mantener el historial de compromiso intacto. Mi solución actual era simplemente eliminar los archivos relacionados con hg y luego git init && agregar manualmente los archivos que necesitaba, pero eso no guardaría el historial. ¿Hay alguna solución para esto?
Algunas notas de mi experiencia convirtiendo Mercurial a Git.
1. hg-fast-export
El uso de hg-fast-export falló y necesitaba --force como se indicó anteriormente. A continuación recibí este error:
error: no se puede bloquear ref ''refs / heads / stable'': ''refs / heads / stable / sub-branch-name'' existe; no se pueden crear ''refs / heads / stable''
Al finalizar el hg-fast-export, terminé con un repositorio amputado. Creo que este repositorio tenía unas cuantas ramas huérfanas y que hg-fast-export necesita un repositorio algo idealizado. Todo esto parecía un poco áspero alrededor de los bordes, así que pasé a Kiln Harmony ( http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/ )
2. Horno
Kiln Harmony no parece existir en una cuenta de nivel libre como se sugirió anteriormente. Podría elegir entre los repositorios Git-only y Mercurial-only y no hay opción para cambiar. Levanté un ticket de soporte y compartiré el resultado si responden.
3. hg-git
El complemento mercurial de Hg-Git ( hg-git ) funcionó para mí. FYI en Mac OSX instalé hg-git a través de macports de la siguiente manera:
- puerto sudo instalar python27
- selección de puerto sudo - set python python27
- puerto sudo instalar py27-hggit
- vi ~ / .hgrc
.hgrc necesita estas líneas:
[ui]
username = Name Surname <[email protected]>
[extensions]
hgext.bookmarks =
hggit =
Entonces tuve éxito con:
hg push git+ssh://[email protected]:myaccount/myrepo.git
4. Advertencia: Conoce tu repo
Todo lo anterior son instrumentos contundentes y solo seguí adelante porque tomó suficiente tiempo para que el equipo usara git correctamente.
Al presionar por primera vez el proyecto por (3) terminé con todos los cambios nuevos que faltaban. Esto se debe a que esta línea de código debe verse solo como una guía:
$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created
La teoría es que la rama predeterminada puede considerarse maestra cuando se empuja a git, y en mi caso heredé un repositorio en el que utilizaron "estable" como el equivalente de maestro. Además, también descubrí que la punta del repositorio era una revisión que aún no se había fusionado con la rama ''estable''.
Sin entender correctamente tanto Mercurial como el repositorio a convertir, probablemente sea mejor que no realice la conversión.
Hice lo siguiente para preparar el repositorio para un segundo intento de conversión:
hg update -C stable
hg merge stable/hotfix-feature
hg ci -m "Merge with stable branch"
hg push git+ssh://[email protected]:myaccount/myrepo.git
Después de esto tuve un proyecto verificable equivalente en git, sin embargo, todas las ramas huérfanas que mencioné anteriormente se han ido. No creo que eso sea demasiado serio, pero puedo vivir para lamentarlo como un descuido. Por lo tanto, mi pensamiento final es mantener el original de todos modos.
Editar: Si solo quieres el último commit en git, esto es más simple que la combinación anterior:
hg book -r tip master
hg push git+ssh://[email protected]:myaccount/myrepo.git
Desde:
http://hivelogic.com/articles/converting-from-mercurial-to-git
Emigrando
Es un proceso relativamente simple. Primero descargamos la exportación rápida (la mejor forma es a través de su repositorio Git, que clonaré directamente en el escritorio), luego creamos un nuevo repositorio git, realizamos la migración y comprobamos HEAD. En la línea de comando, va así:
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
Debería ver una larga lista de vuelos de confirmación, ya que su proyecto se migra después de ejecutar fast-export. Si ve errores, es probable que estén relacionados con una ruta de Python mal especificada (consulte la nota anterior y personalice para su sistema).
Eso es todo, ya está hecho.
Esto sería mejor como comentario, lo siento, no tengo permisos para comentar.
@ mar10 comentario fue la pieza que faltaba que necesitaba para hacer esto.
Tenga en cuenta que ''/ path / to / old / mercurial_repo'' debe ser una ruta en el sistema de archivos (no una URL), por lo que debe clonar el repositorio original antes. - mar10 dic 27''13 a las 16:30
Este comentario fue en lo que respecta a la respuesta que resolvió esto por mí, https://.com/a/10710294/2148757 que es la misma respuesta que está marcada como correcta aquí, https://.com/a/16037861/2148757
Esto movió nuestro proyecto hg a git con el historial de compromiso intacto.
Ok, finalmente resolví esto. Esto está utilizando TortoiseHg en Windows. Si no lo estás usando puedes hacerlo en la línea de comandos.
- Instalar TortoiseHg
- Haga clic derecho en un espacio vacío en el explorador, y vaya a la configuración de TortoiseHg:
- Habilitar
hggit
:
Abra una línea de comando, ingrese un directorio vacío .
git init --bare .git
(Si no usa un repositoriogit init --bare .git
, obtendrá un error comoabort: git remote error: refs/heads/master failed to update
cd
a tu repositorio de Mercurial.hg bookmarks hg
hg push c:/path/to/your/git/repo
En el directorio de Git:
git config --bool core.bare false
(No me preguntes por qué. Algo sobre los "árboles de trabajo". Git es muy hostil. Juro que escribir el código real es más fácil que usar Git.)
Esperemos que funcione y luego puedas pasar de ese nuevo repositorio de git a uno que no sea simple.
Otra opción es crear una cuenta de Kiln gratuita: redondear los viajes de ida y vuelta entre git y hg con un 100% de retención de metadatos, para que pueda usarlo una vez o convertirlo para acceder a un repositorio utilizando el cliente que prefiera.
Si desea importar su repositorio de mercurial existente a un repositorio ''GitHub'', ahora puede usar el Importador de GitHub disponible here [es necesario iniciar sesión]. No más perder el tiempo con la exportación rápida, etc. (aunque es una herramienta muy buena)
Obtendrá todos sus confirmaciones , ramas y etiquetas intactas. Otra cosa interesante es que también puedes cambiar la identificación del correo electrónico del autor . Echa un vistazo a las siguientes capturas de pantalla:
Tenía una tarea similar que hacer, pero contenía algunos aspectos que no estaban suficientemente cubiertos por las otras respuestas aquí:
- Quería convertir todas las ramas (en mi caso: dos, o en general: más de una) de mi repositorio.
- Tenía caracteres no ASCII y (siendo un usuario de Windows) no codificados en UTF8 (para los curiosos: alemán umlaute) en mis mensajes de confirmación y nombres de archivos.
No probé la exportación rápida y la exportación hg-rápida, ya que requieren que tengas Python y algunos módulos de Mercurial en la máquina, que no tenía.
Intenté hg-init con TortoiseHG, y esta respuesta me dio un buen comienzo. Pero parecía que solo convierte la rama actual, no todas a la vez (*). Así que leí los documentos de hg-init y esta publicación del blog y los agregué.
[git]
branch_bookmark_suffix=_bookmark
a mi mercurial.ini, y lo hice
hg bookmarks -r default master
hg bookmarks -r my_branch my_branch_bookmark
hg gexport
(Repita la 2ª línea para cada rama que desee convertir, y repítala nuevamente si tiene que hacer otra confirmación antes de ejecutar la 3ª línea). Esto crea una carpeta git
dentro de .hg
, que resulta ser un repositorio Git simple con todas las ramas exportadas. Podía clonar este repositorio y tenía una copia de trabajo según lo deseado.
O casi ...
Corriendo
git status
en mi copia de trabajo mostraba todos los archivos con caracteres no ASCII en sus nombres como archivos sin seguimiento. Así que seguí investigando y seguí este consejo :
git rm -rf --cached /*
git add --all
git commit
Y finalmente el repositorio estaba listo para ser subido a Bitbucket :-)
También probé con el importador Github como se menciona en esta respuesta . Utilicé Bitbucket como sistema de origen, y Github hizo un buen trabajo, es decir, convirtió todas las sucursales automáticamente. Sin embargo, mostraba ''?'' - caracteres para todos los caracteres no ASCII en mis mensajes de confirmación (Web-UI y localmente) y nombres de archivo (solo Web-UI), y aunque podía corregir los nombres de archivo como se describe anteriormente, no tenía idea qué hacer con los mensajes de confirmación, por lo que prefiero el enfoque hg-init. Sin el problema de la codificación, el importador de Github hubiera sido una solución perfecta y rápida (siempre y cuando tenga una cuenta de Github pagada o pueda tolerar que su repo sea pública durante el tiempo que sea necesario para llevarla de Github a su máquina local).
(*) Parecía que antes había descubierto que tenía que marcar todas las sucursales que quería exportar. Si lo haces y presionas para obtener un repo (!) Simple, como dice la respuesta vinculada, obtienes todas las ramas.
Puedes intentar usar 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
También eche un vistazo a esta pregunta SO .