Cómo migrar / convertir de SVN a Mercurial (hg) en Windows

120

Estoy buscando una herramienta para migrar un par de repositorios SVN a Mercurial, con historial, etiquetas, etc.

Estoy usando TortoiseHg (Windows x32), por lo que ConvertExtensions se descartan. Hay algo de información sobre cómo hacer este proceso en una caja Linux ( hgsvn ), pero no tengo una máquina Linux disponible.

¿Puedo usar esos scripts de Python en Windows? Si es así, ¿qué necesito para hacerlo? O, ¿qué otras herramientas puedo utilizar para realizar este proceso?

Básicamente, ¿cómo puedo convertir un proyecto SVN a Mercurial?

David Lay
fuente

Respuestas:

93

Solo tenía que abordar este problema yo mismo. Tengo una máquina con Windows XP con un servidor de Windows separado que aloja VisualSVN Server .

También tengo instalado TortoiseHG , así como el cliente de línea de comandos CollabNet Subversion .

<Enable Convert Extension w/ Tortoise Hg 2>

Muchas gracias a bgever por señalar en los comentarios que con TortoiseHg 2.0, habilitar la extensión de conversión es más fácil que nunca. Como el dice

Con TortoiseHG 2.0 esto se ha simplificado mucho: Inicie TortoiseHG Workbench desde el menú Inicio. Seleccione Archivo -> Configuración. Seleccione Extensiones de la lista. Marque la casilla de verificación 'convertir' y haga clic en Aceptar. ¡Eso es! Ya no es necesario intentar generar el archivo de configuración y buscarlo en el sistema de archivos. - bgever 11 de marzo a las 7:56

</Enable Convert Extension w/ Tortoise Hg 2>

<Enable Convert Extension Manually>

Para convertir un repositorio de SVN a HG, seguí estos pasos:

1) Abra C: \ Archivos de programa \ TortoiseHg \ Mercurial.ini

EDITAR

FYI - Tortoise Hg ha migrado este archivo a

  • XP o anterior - C: \ Documents and Settings \ USERNAME \ Mercurial.ini
  • Vista o posterior - C: \ Users \ USERNAME \ Mercurial.ini

Ese archivo estará casi vacío y solo enumerará lo que le gustaría anular allí. Si eso es lo que tiene, simplemente agregue estas dos líneas al final del archivo:

[extensions]
convert =

2) Busque la línea que comienza con

[extensiones]

3) Debajo verá una lista de palabras clave, comentadas con un punto y coma (;) en cada línea.

4) Encuentra la línea que dice

; convertir =

y elimine el punto y coma para que se lea

convertir =

</Enable Convert Extension Manually>

5) Abra el símbolo del sistema y navegue hasta el directorio en el que le gustaría que se creara la nueva carpeta hg (el proceso creará una nueva carpeta llamada yoursvnreponame-hg en el directorio al que está abierto el símbolo del sistema).

6) Utilice este comando

hg convertir archivo: /// y: / yoursvnreponame

Descubrí que la herramienta de conversión puede tener problemas con los repositorios en red, así que tuve que asignarle una unidad, pero esto funcionó bien para mí.

Michael La Voie
fuente
Seleccionar la respuesta a esta pregunta fue difícil. evilbloodydemon tenía razón cuando comentó en su respuesta editar la configuración para habilitar la extensión de conversión, pero esta respuesta es más clara y precisa
David Lay
1
Solo quería mencionar que probé esto sin el cliente de línea de comando SVN y funcionó también. Ni siquiera necesita un servidor SVN funcionando para hacer esto, solo acceda a la ruta del archivo del repositorio.
Michael La Voie
Esto funcionó bien para mí con Mercurial V1.4.3. Un repositorio svn de 1 año de antigüedad se convirtió muy rápidamente con el historial completo intacto. ¡Muchas gracias!
Jonathan Webb
1
Solo para agregar: el archivo ini no se crea en una instalación predeterminada de TortoiseHG. Primero debe aplicar / guardar algunas configuraciones o comenzar con un archivo en blanco si sabe lo que está haciendo.
Ahmad
9
Con TortoiseHG 2.0 esto se ha simplificado mucho: Inicie TortoiseHG Workbench desde el menú Inicio. Seleccione Archivo -> Configuración. Seleccione Extensiones de la lista. Marque la casilla de verificación 'convertir' y haga clic en Aceptar. ¡Eso es! Ya no es necesario intentar generar el archivo de configuración y buscarlo en el sistema de archivos.
Bart Verkoeijen
8
  1. inicio del servidor svn en localhost
  2. hg convertir svn: // localhost / your_repo
  3. hecho, porque los enlaces svn solo se necesitan para el protocolo file: //
demonio
fuente
No, ni los binarios mercuriales para win32 ni TortoiseHg vienen con extensiones de conversión, por lo que "hg convert" ni siquiera es un comando válido en win32.
David Lay
1
Intenté usar svn: // en lugar de file: // pero sigue pidiendo enlaces de Python
fglez
Usar svn: // en lugar de file: // funcionó para mí sin los enlaces de Python. Para iniciar el servidor svn, el comando es: svnserve -r <ruta a la raíz del repositorio> -d
Petter Wigle
7

Mercurial tiene una extensión de conversión incorporada para esto .

Abedul de Chad
fuente
2
Lo sé, es lo primero que encontré, pero citando: "Tenga en cuenta que no puede hacer esto con los binarios de Win32 Mercurial; no hay forma de instalar los enlaces de Subversion en su biblioteca Python incorporada". Estoy usando TortoiseHg ...
David Lay
¿Utiliza un Live CD de Linux o una máquina virtual?
richq
Esta es la respuesta absolutamente correcta. He hecho esto usando solo la extensión hg convert ( selenic.com/mercurial/wiki/… ) y usando el protocolo de archivo para el repositorio SVN sin la extensión pysvn: hg convert file: /// X: / HOME / REPOS / mysvnrep newhgrep
van
5

Para convertir un SVN Repo en un HG Repo Y copiarlo en un servidor diferente, necesitará algunas cosas.

  1. TortoiseHG instalado. (Verifique qué versión se está utilizando actualmente)
  2. Python instalado. (Verifique qué versión se está utilizando actualmente)
  3. Los módulos de Python (puede encontrarlos en http://pysvn.tigris.org/project_downloads.html )
  4. Deberá agregar la convertextensión a Tortoise. Inicie TortoiseHG Workbench desde el menú Inicio. Seleccione File -> Settings. Seleccione Extensionsde la lista. Marque la convertcasilla de verificación y haga clic en Aceptar.

Primero la conversión ...

  1. Es mejor asignar la carpeta en la que se encuentra el repositorio SVN actual en la computadora en la que está trabajando. (es decir, \\server\folder no asigne la carpeta SVN Repo en sí. Asigne la carpeta justo encima de ella) Asigne una letra a la unidad asignada, comoY:\
  2. Abra un símbolo del sistema y escriba: CD /D Y:\
  3. Cuando se le Y:\solicite, escriba: hg convert y:/RepoName (use el nombre del repositorio actual) Tenga cuidado con las barras inclinadas hacia adelante y hacia atrás. El del comando es una barra inclinada. Además, si el nombre tiene espacios, ponga el nombre entre comillas. (es decir Y:/"My Repo folder")
  4. Ahora debería estar ejecutándose y creará otra carpeta junto con la anterior. Y una carpeta hg debe estar dentro. ¡NO SE INICIARÁ Y NO SE INICIARÁ!
  5. La conversión está completa.

En segundo lugar, la clonación ...

  1. Abra el banco de trabajo TortoiseHG. IrFile -> Clone Repository
  2. Fuente: ingrese la ruta completa del repositorio convertido.
  3. Destino: ingrese la ruta completa de donde desea que se clone el repositorio. No es necesario crear una carpeta en el nuevo destino, ya que el proceso de clonación la creará y la inicializará.
  4. Agregue los permisos a la nueva carpeta clonada.
  5. ¡¡¡Ya terminaste !!!
SueS
fuente
Hola, ¿es posible explicar por qué no deberías tener initel primer repositorio?
Ben Page
3

Nadie todavía no menciona hgsubversion ( Extension Wiki ), que puede hacerlo sin casi ningún dolor de cabeza (excluyendo casos raros y árbol específico).

Simplemente agregue la extensión, habilítela y hg clone SVN_REPOal repositorio local de Mercurial

Tejón perezoso
fuente
1

Esto está en las preguntas frecuentes de TortoiseHg :

¿Cómo puedo convertir un repositorio de Subversion a Mercurial?

Debe instalar las herramientas de línea de comando svn-win32-1.4.6 y luego agregarlas a su ruta. Entonces debes habilitar la extensión de conversión. En este punto, debería poder utilizar el hg convertcomando " " para realizar la conversión. Dirija los problemas / preguntas sobre la extensión de conversión a la lista de correo de Mercurial o #mercurialal irc.freenode.net.

Entonces, aparentemente es posible: estoy usando Linux, así que no lo he probado.

Martin Geisler
fuente
0

Acabo de convertir un repositorio SVN remoto con autenticación HTTP en un repositorio de Mercurial, y déjame decirte que no hay mucha documentación sobre cómo hacer esto. Tuve que descargar la fuente de Mercurial e instalarla de forma independiente, usando el paquete de fuentes, de esa manera los enlaces SVN funcionarán correctamente.

Lo instalé como:

python setup.py install

Que funcionó bien en mi caja Server 2003. Ahora puedo convertir un repositorio SVN de la manera correcta, haciendo algo como esto:

python c:\python26\scripts\hg convert <remote repo>

La documentación de ConvertExtension en el sitio de Mercurial no es muy clara, pero dice esto:

No hay forma de instalar los enlaces de Subversion en la biblioteca Python incorporada de [Mercurial]. Por lo tanto, deberá usar un Mercurial instalado sobre un Python independiente

Así que ahora solo uso la versión independiente para convertir y TortoiseHg para el trabajo real de VCS.

Alex Fort
fuente
0

mejor tarde que nunca ...

Dos respuestas por el precio de una ...

  1. Si se trata de un repositorio público de código abierto, puede usar http://svn2github.com/add/, que tardó aproximadamente media hora en clonar ese repositorio en GitHib y luego simplemente extraerlo en Hg.

  2. La ventaja de usar hg convertes que se puede reanudar. Convertir SVN a Hg puede llevar días . Si detiene esto, se reanudará desde donde lo dejó.

A continuación se muestra un archivo por lotes que escribí porque Codeplex SVNbridge basura. El repositorio de este ejemplo tardó un par de días en recuperar todo el historial (estoy en Australia, por lo que la latencia puede haber sido un factor). Me gustaría pensar que le dio una buena paliza a un servidor TFS en algún lugar.

Este archivo por lotes se puede ejecutar en cualquier momento para extraer actualizaciones de la fuente SVN si resultan ser los únicos que quedan en la tierra que todavía usan SVN. No lo he probado, así que mira qué sucede si haces esto, así que si yo fuera tú, abandonaría la rama original si vas a editar el repositorio.

El robocopy shamapasunto es mantener el historial de SVN si clona el repositorio de Hg, shamap es efímero: verifique el archivo por lotes y el shamap en (haría eso en una nueva rama).

el lote...

@echo off
mode con:cols=100 lines=800

:: Change the SVN remote name here
::
set remote=https://cinch.svn.codeplex.com/svn
::

title Fetching SVN from %remote%. This could take...DAYS
echo .
echo Fetching SVN checkins from %remote%
echo .
echo Dependencies: Tortoise Hg and hg.exe in the Path would be ideal.
echo using hg convert
echo .
echo First, I will make a backup of shamap in the hg repo folder.
echo If shamap in .hg\ is newer then it will be copied to the repo.
echo You should commit it so hg clones of this repo work with this.
echo Commit this .BeeyATch file as well.
echo shamap keeps track of what has been fetched from SVN.
echo ok, that ends the educational part of this script...
echo Now I will fetch SVN changes from
echo %remote%
echo ...
echo ...(this could take quite some time)...
echo ...DAYS...yes...DAYS
echo ...especially if it's fecking Codeplex SVN...
echo .
echo If this craps out just run it again - it will resume from where it left off. 
echo and fetch the rest...eventually
echo .
echo Control C to abort or any other key to start:
echo .

pause

echo .
:: http://mercurial.selenic.com/wiki/ConvertExtension <== see for details of shamap
:: copy the shamap from the original convert into the .hg folder unless it is already there & newer
:: don't panic if shamap is much bigger than the original - diff it to see why
robocopy .\ .\.hg\ shamap /XO 
robocopy .\.hg\ .\ shamap /XO 
echo .

hg convert --verbose --debug %remote% "%CD%"
echo .
echo .
echo Finished fetching from %remote%
title Finished fetching from %remote%
echo Any  key to Exit
echo .
pause

exit
Tipo CAD
fuente
0

Usando la convertextensión de Mercurial:

  1. Habilitar extensión de conversión; agregar convert=a la [extensions]sección de .hgrc así:

    [extensiones]
    convertir =

  2. Linux necesita enlaces de Python adicionales: sudo apt-get install python-subversion
  3. Ejecutar hg convertcomando
    • Ver hg convert -hpara obtener ayuda
    • Ejemplo: hg convert http://[svnserver]/[Project] --source-type svn [DestinationDir] (ver nota 2)
  4. Enviar al repositorio Mercurial recién creado: hg push https://[mercurialserver]/[Project]

nota : incluso puede repetir el comando hg convert para incluir los nuevos cambios realizados en el repositorio svn después de la conversión anterior.

nota 2 : cuando hg convert no funciona usando http://o svn://, primero puede verificar el repositorio de Subversion (o actualizar uno existente) y convertir usando la verificación local; ejemplo:hg convert [DirectoryOfLocalCheckout] --source-type svn [DestinationDir]

R. Oosterholt
fuente