svn - ¿Cómo mantener las marcas de tiempo de revisión al convertir un repositorio de Mercurial a Subversion?
version-control (4)
Es un tema complicado. ¿Por qué abordar la solución de manera diferente:
https://bitbucket.org/durin42/hgsubversion/wiki/Home
Esta es una extensión de Mercurial que le permite acceder a ella como un Cliente SVN, ¿podría funcionar para usted?
Debido a las políticas de trabajo, me veo obligado a usar Subversion. Actualmente he desarrollado algo de código utilizando Mercurial, y tengo que convertir este repositorio en un nuevo repositorio de Subversion. El repositorio actual de Mercurial también contiene partes de código heredado que copié de otro repositorio SVN (un controlador HW), y este código contiene palabras clave (como $Id: ...$
) que se expandieron mientras copié el código.
Mi enfoque actual para hacer la conversión es:
hg convert --dest-type svn repository.hg repository.svn
Esto funciona, desafortunadamente no conserva las marcas de tiempo de las revisiones de Mercurial. Además, expande las etiquetas en algunas partes de código heredado donde alguien escribió $Id: ...$
cosas.
Las preguntas:
- ¿Cómo puedo exportar a Subversion, manteniendo las marcas de tiempo de las revisiones?
- ¿Cómo puedo convertir sin expandir las palabras clave de estilo $ Id: $ o, mejor aún, eliminar las líneas ofensivas al convertir? ¿Es esto posible, o tengo que modificar el historial del volcado de Mercurial antes de realizar la conversión para asegurarme de que no haya palabras clave?
Lo siento si esta pregunta ya ha sido respondida, he buscado intensamente en Google y aquí, pero no puedo encontrar una respuesta para este problema. Especialmente el problema de la marca de tiempo debe ser algo que otros ya han encontrado.
Saludos, H.
EDITAR: Desde entonces he creado un script que extrae marcas de tiempo de un archivo de exportación de Mercurial y actualiza un archivo de volcado de Subversion, que no es más que un kludge, pero funciona. El problema de $Id:
sigue sin resolverse, desafortunadamente.
Hasta donde entiendo su problema ahora: tiene un repositorio de Hg que una vez se convirtió de SVN, donde se usó la expansión de palabras clave. Ahora las palabras clave expandidas permanecen sin cambios en el repositorio de Hg. Ahora desea eliminar esas palabras clave (o simplemente sus valores expandidos) del historial de Hg, conservando el autor, la fecha / hora, el mensaje de confirmación y, por supuesto, los archivos modificados.
Esto es solo una idea, nunca lo he hecho en la práctica, pero ... Hablando solo de mercurial, creo que es posible hacerlo mediante una combinación del comportamiento mercurial habitual, solo para una rama y sin etiquetas y otras ramas:
- Clone el repositorio fuente deseado
- Preparar un repositorio de Hg vacío
- Ejecute
hg log > logfile.txt
sobre el repositorio de origen en la rama que desea cambiar - Analice el archivo obteniendo una lista estructurada de toda la información necesaria, como el número de conjunto de cambios, el usuario, la fecha y el resumen, almacene esto en una estructura de datos que permita una fácil iteración.
- Iterar a través de la lista (o usar directamente el archivo de registro) y ...
- borrar todos los archivos de trabajo del repositorio de destino
- exportar un conjunto de cambios desde el repositorio de origen a la copia de trabajo del repositorio de destino
- Cambia cualquier cosa en los archivos de trabajo que quieras hacer.
-
hg addremove
-
hg commit -m ... -d ... -u ...
- Repita el paso 5 tantas veces como sea necesario
El inconveniente es que los conjuntos de cambios obtendrán nuevos valores hash, por lo que las etiquetas y los marcadores deben actualizarse.
Si hay otras ramas que deben ser migradas:
- Actualiza el repositorio de destino al punto de inicio de esa rama.
- y la fuente de repos, también
- inserte los pasos 3 a 6 de la lista anterior aquí
Quizás haya más trabajo por hacer, pero creo que esto podría funcionar. Como se dijo antes, nunca he hecho esto.
Intenté la sustitución de palabras clave una vez en SVN y tuve que agregar una propiedad svn:keywords
a la carpeta de trabajo que indica qué palabras clave se deben sustituir. Por lo tanto, eliminar esta propiedad debería hacer el trabajo.
Este artículo sobre posiblemente esté relacionado con esta pregunta.
Quiero volver a sugerir https://bitbucket.org/durin42/hgsubversion/wiki/Home como una solución. En el caso normal, se usa para acceder a un repositorio de Subversion usando hg
, pero también puede usarlo para convertir un repositorio de Mercurial a Subversion si no tiene miedo de trabajar en su historial de conjuntos de cambios. (Si sabes cómo trabajar con conjuntos de cambios, tienes bastante control sobre el proceso).
Esencialmente, tienes que hacer los siguientes pasos:
- Haga que su historia de Mercurial sea lineal (esto es necesario para Subversion); puede usar la extensión Collapse para contraer cualquier área no lineal del historial en un solo conjunto de cambios
- Cree un repositorio o directorio de Subversion y
hg pull
esta ruta SVN (usando hgsubversion) a su repositorio de Mercurial. Es posible que la ruta de Subversion no esté vacía para esto, pero siempre que no haya superposición con los archivos en el repositorio de Mercurial, esto debería estar bien. - Cambie de base todos los conjuntos de cambios de la historia de Mercurial a la cabeza de la historia de Subversion. Esto se hace usando la extensión Rebase . Si no hay superposición, esto debería ser una operación automática.
- Utilice
hg push
para enviar el resultado a Subversion. El conjunto lineal de cambios que descienden de la cabecera anterior del repositorio de Subversion se agregará a la ruta de Subversion.
Revisa este artículo del blog para ver algunos comandos de línea de comandos concretos que puedes usar.