Tenemos un repositorio de subversión no estándar que nos gustaría convertir a Git. El problema es que realmente no sé por dónde empezar para asegurarnos de mantener la historia completa, pero no terminamos con un completo desastre.Cómo manejar la importación de subversión no estándar a Git
Nuestro repositorio cuenta con los últimos 6 años de historia para nuestro paquete de productos de empresas y ha pasado por múltiples reestructuraciones. En todos los casos, tenemos una base de código de plataforma central y luego varios proyectos/complementos que se combinan de diferentes maneras en la parte superior de la plataforma central.
El primer par de años se estructuró como:
-- plugin1
- trunk
- branches
- tags
-- pluginX
- trunk
- branches
- tags
-- trunk (core platform)
- <various sub dirs)
-- branches (various feature branches of the entire repository)
- refactoring1
- refactoringX
-- tags (various tags of customer releases of full respository)
- customerX_1.x
-- vendor (vendor drops and tracking of 3rd party source deps)
- 3rd_party_code_A
- 3rd_party_code_X
Con el tiempo hemos añadido un par de directorios son la raíz incluyendo:
-- releases (replaced tags; branches for released stable versions of repos)
-- sandbox (area for misc projects of interest; should have been new repo)
Luego limpiar esto y terminó con:
-- trunk
- platform
- plugin1
- pluginX
-- stable (stable release branches of trunk)
- 1.1
- 1.2
-- tags (release points; marks a point on a stable branch)
- 1.1.1
- 1.1.2
-- vendor
-- sandbox
-- releases (copies of old releases of interest)
Así que esa es nuestra historia. Lo que queremos terminar es, con suerte, mucho más limpio. En este momento estamos pensando en la base del repositorio git que se ve así (básicamente una copia del directorio 'trunk' anterior).
- platform
- plugin1
- pluginX
Branches:
- stable/1.1
- stable/1.2
Tags:
- rel/1.1.1
- rel/1.1.2
Nos gustaría poner sandbox y el vendedor en sus propios repositorios. (no estoy seguro de cómo hacer esto, pero tal vez haya una manera de importar solo un subconjunto de un repositorio svn)
En cuanto a las ramas y etiquetas, queremos que el código de 'estable' termine como ramas, el código de 'etiquetas' para terminar como etiquetas en estable.
Para el historial anterior de la estructura original, nos gustaría mantener la mayor cantidad posible de historia, pero no queremos contaminar el nuevo repositorio. Por ejemplo, si pudiéramos mirar hacia atrás y ver los cambios que ocurrieron en las ramas de refactorización, serían geniales pero no absolutamente necesarios.
Actualmente estamos debatiendo cómo proceder y cómo obtener todo reestructurado e importado de una manera limpia. Lo mínimo que necesitamos es una forma de tener un historial completo de la plataforma y el código de complemento en ambas reestructuraciones de repositorio anteriores. Si es posible, también nos gustaría obtener la información estable y de etiqueta de la estructura del repositorio más reciente.
¿Alguien tiene recomendaciones sobre cómo hacer esta importación?
Por ejemplo:
- ¿Es posible mantener el historial completo a través de las reestructuraciones?
- ¿Deberíamos reescribir el repositorio de subversión de alguna manera para limpiarlo antes de la importación y, de ser así, cómo?
- ¿Deberíamos importar el historial completo y luego reestructurarlo en Git y de qué manera?
- ¿Alguna idea de cómo hacer esta importación limpia?
plugin1 y pluginX son esencialmente repositorios independientes con su propio tronco/ramas/etiquetas, ¿verdad? – prusswan
Así es como comenzaron, pero descubrimos que no funcionó bien porque el código cambia todo al mismo tiempo. Entonces nos movimos hacia la segunda estructura de repositorio. Esa estructura funciona muy bien para nosotros ahora y queremos mantenerla con Git, solo preocupados por cómo mantener la historia a lo largo del viaje. – Allen
Para mantener la historia completa, supongo que es una cuestión de averiguar qué ramas deben mapear a qué rutas, y mucha paciencia (la clonación de git-svn lleva mucho tiempo para svn con historias profundas). Esencialmente esos troncos se convertirán en ramas de git de todos modos (aunque puede designar uno de ellos para ser troncal/maestro que de hecho sigue siendo una rama) – prusswan