Migre un repository que no siempre use la estructura troncal / twigs / tags de SVN a GIT

Estoy buscando una forma de permanentemente (es decir, no se usará gitsvn después de la import y el repository se clonará nuevamente para deshacerse de todos los rests de git-svn) migrar uno de mis repositorys SVN a git. Por lo general, esto sería algo fácil: simplemente siga los pasos explicados en http://www.jonmaddox.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/ .

Sin embargo, en el repository SVN cambié a la estructura troncal / twigs / tags después de un time, así que aproximadamente la mitad de las ~ 2000 confirmaciones están trabajando con el tronco real en / mientras que la otra mitad lo tiene en / trunk / (es decir, hay un gran commit moviendo todo) entonces ni usar -s ni usarlo cuando se realiza la initialization de git svn funcionará correctamente.

Ahora estoy buscando una forma de importar el repository a git correctamente, es decir, preservar la información de la twig (sin tags, nunca he creado ninguna) sin dañar las confirmaciones anteriores. En caso de que no sea posible, me gustaría saber si hay una forma de reescribir los compromisos anteriores para cambiar el repository, de modo que use la estructura troncal / twigs / tags; entonces, simplemente podría usar -s en git-svn.

TL, DR: Es posible arreglar un repository desorderado como el descrito en la pregunta cuando se acepta algún trabajo manual. La forma más fácil es hacerlo con el file de volcado SVN y luego simplemente importarlo usando git-svn con la opción stdlayout .


Logré hacerlo reescribiendo el svndump del repository para include la estructura adecuada desde el principio:

 svnadmin dump orig/ --incremental > repo.svndump 

Luego usé una pequeña secuencia de commands Perl en línea para cambiar las carpetas:

 perl -pe 's/^Node-path: (?!trunk|branches|tags)(.+)$/Node-path: trunk\/$1/g' repo.svndump > repo2.svndump 

Como el volcado ahora no era válido, la carpeta trunk necesitaba ser creada en r0 y el compromiso moviendo todo desde / hacia /trunk necesitaba borrarse – Edité el file volcado manualmente (afortunadamente todos los metadatos son text plano) y agregué lo siguiente al comienzo de los cambios para r0:

 Node-path: trunk Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END 

En la confirmación moviendo todos los files, eliminé todas las acciones y agregué lo siguiente para crear la carpeta de branches (de la misma manera para la carpeta de tags si la había usado)

 Node-path: branches Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END 

El file de volcado editado ahora podría cargarse usando svnadmin load , dándome un repository que git-svn podría importar sin ningún problema.