¿Cómo muevo una sola carpeta de un repositorio de Subversion a otro repositorio?

156

Tengo una carpeta "docs" en un repositorio de Subversion llamado "project". Llegué a la conclusión de que realmente debería mantenerse en un repositorio de Subversion separado llamado "project_docs".

Me gustaría mover la carpeta "docs" ( y todas sus revisiones ) al repositorio "project_docs". ¿Hay alguna forma de hacer esto?

leftend
fuente

Respuestas:

183

Si tiene acceso al repositorio en sí (no una copia de trabajo), debería poder volcar el repositorio actual, filtrarlo para incluir solo información sobre la carpeta docs y cargarlo en el otro repositorio.

Sería algo como esto:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

Sin acceso al repositorio, no puede mantener el historial de revisiones y debe conformarse con copiar los archivos en el nuevo repositorio y confirmar.

Samuel
fuente
1
Buen ejemplo Tenga en cuenta que, como se indica en la documentación a la que me vinculé, esta solución volverá a numerar todas las revisiones para que no haya "vacíos". Algo a tener en cuenta si hace referencia a las revisiones de documentos en cualquier otro lugar.
Adam Bellaire
1
Sugerí eliminar las revisiones vacías para evitar agregar un montón de revisiones vacías al repositorio de destino, lo que probablemente confundirá a cualquiera que no supiera sobre la carga. Dado que --preserve-revprops mantendrá los mensajes de confirmación en lugar de usar el predeterminado de carga.
Samuel
11
Gracias por la respuesta. En caso de que alguien necesite saber, si necesita más de una carpeta, simplemente coloque un espacio entre ellas en la lista de inclusión. Ex. ... include folderOne folderTwo
Robin Robinson
66
Renumeración de las revisiones es probablemente una mala idea, ya que los mensajes de confirmación y herramientas de seguimiento problema puede referirse a ellos
Wim Coenen
55
Esto funcionó para mí. Soy un usuario de Windows (Visual SVN Server) y mi primer comando se veía así, si ayuda a alguien:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris
30

svndumpfilter tiene una falla grave: si un archivo o ruta se copió de una ruta que está filtrando a una que está filtrando, svndumpfilter no podrá completar el historial y el trabajo fallará.

Puede usar svndumpfilter2 si experimenta este problema.

compie
fuente
44
Aquí hay un mejor enlace para svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin
En ese caso, puede agregar la ruta requerida a la lista ... siendo lo más específico posible ... y luego eliminar esas entradas del proyecto después de la importación.
James Gawron
6

Esto se discute en la documentación de SVN. Consulte la sección Mantenimiento del repositorio ensvndumpfilter ... Describe específicamente cómo volcar proyectos fuera de un repositorio central y moverlos a repositorios nuevos e independientes.

Adam Bellaire
fuente
2

No creo que pueda hacerlo de forma remota (es decir, sin una copia local). Pero esto debería funcionar: svn exportla carpeta del servidor original, luegosvn add a su nuevo repositorio.

Me gusta:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

Editar: D'oh, esto deja caer la historia. Usar svnadmincomo lo describe Samuel .

Peter Stone
fuente
3
Sin embargo, no puede mantener las revisiones sin acceso al repositorio en sí. Si solo puede tener una copia de trabajo, esto es lo mejor que puede hacer.
Samuel
2

Para futura referencia:

La documentación de SVN informa claramente:

Si planea editar manualmente el archivo de volcado para eliminar un directorio de nivel superior, asegúrese de que su editor no esté configurado para convertir automáticamente los caracteres de fin de línea al formato nativo (por ejemplo, \ r \ n a \ n), ya que el contenido no estará de acuerdo con los metadatos. Esto hará que el archivo de volcado sea inútil.

¡Use sed o Vim para sustituir el directorio de nivel superior, pero este nombre de directorio también estaba contenido dentro de un archivo de proyecto ! Esto provoca un error de suma de comprobación de carga SVN.

Entonces, cuando realice esta operación, no haga sustituciones de cadenas con sed de solo el nombre de la ruta.

Sustituya "Node-path: old_path" con "Node-path: new_path". Consulte el capítulo 5 del libro SVN “administración del repositorio” para obtener más detalles.

nios
fuente
1

Traté de usar la respuesta aceptada, pero tenía un gran repositorio y quería exportar un directorio pequeño, y no podía permitirme volcar todo el repositorio.

Por lo tanto, solo exporté las revisiones donde cambió mi directorio (Esto puede no funcionar si el directorio que desea exportar tiene referencias a otros lugares en su repositorio).

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

Debe reemplazar su URL de repositorio ( URL_to_docs), ubicación en el servidor ( /svn/old_repo) y ruta a los documentos en el repositorio (path/to/docs )

Puede editar fácilmente su docs_only.dumpsi desea cambiar la ubicación de su directorio de documentos en su nuevo repositorio.

Renato
fuente