2009-03-25 19 views
9

Tengo un repositorio cada vez mayor que contiene una docena de proyectos que mantengo usando TortoiseSVN (ya que soy completamente nuevo en esto y aún no conozco los pormenores). El espacio que tengo para mantener el repositorio es limitado, así que quiero hacer una copia de seguridad y luego eliminar algunas de las versiones anteriores. Por ejemplo, si un proyecto está en la versión 50, quiero mantener solo 50,49,48.¿Cuál es la mejor manera de limpiar un repositorio de Subversion?

+2

Nº Mover el repositorio a un espacio más grande. – yfeldblum

+0

Debería leer el libro "Control de versiones con Subversion" (gratis como en beer) en http://svnbook.red-bean.com/ para obtener una mejor comprensión del punto de control de la versión. –

Respuesta

1

No hay forma de "cortar" un repositorio en una revisión en particular de la manera que usted describe. Lo que podría hacer es svn export el repositorio completo en la revisión deseada, luego importarlo a un nuevo repositorio, luego reproducir las confirmaciones de las revisiones después de eso desde su archivo de registro en el nuevo repositorio. Esto no es trivial.

Alternativamente, si solo quiere excluir algunas rutas desordenadas de su repositorio, y tiene acceso directo al sistema de archivos donde reside el repositorio, puede usar una combinación de svnadmin y svndumpfilter para seleccionar las rutas que desea y podar todos los demás.

Tenga en cuenta que lo que está describiendo está más o menos en contra de la idea de Subversion: se supone que debe mantener todo. Si con frecuencia tiene problemas con esto, considere establecer mejores prácticas de registro. O considere usar Git, lo que hace que este tipo de experimentación sea prácticamente gratuita.

+0

Las ramas (svn copy) en subversión son casi gratuitas, tanto en tiempo como en espacio. Y a partir de la subversión 1.6, las fusiones de parches entre sucursales utilizan el uso compartido de representaciones para evitar la duplicación de datos. No tengo idea de a qué se refiere al decir "las sucursales son caras en svn". –

+0

En general, jugar con svn-dumpfilter es mucho más laborioso que jugar con git-filter-branch y/o .git/info/injertos. He parcheado fuertemente svn-dumpfilter para soportar más tipos de edición de historial, y aún no es una buena herramienta. – emk

+0

@wcoenen: tienes razón. No lo dije muy bien en absoluto. @emk: De acuerdo, es bastante horrible. Hoy en día, principalmente uso Git. –

12

La eliminación de revisiones antiguas es una especie de derrota en el control de versiones, pero puede simplemente eliminar las revisiones que desea conservar, luego colocarlas en un repositorio nuevo y eliminar el anterior.

svnadmin dump /path/to/current/repo -r48:50 > svn.dump 
svnadmin create /path/to/new/repo 
svnadmin load /path/to/new/repo < svn.dump 

O utilice svndumpfilter a incluir/excluir los bits en concreto que desea, etc. Hay también algo de información en las preguntas más frecuentes acerca de SVN removal que pueden serle de utilidad.

+0

¿No solo va a volcar los * commit * específicos de las revisiones 48 a la 50? Creo que está buscando el estado del repositorio tal como estaba en la revisión 48, no solo el compromiso allí. –

+0

Acabo de probar esto. Esto no hace lo que creo que el OP quiere en absoluto: obtiene * solo * los commits de esas revisiones. No obtiene "el estado del repositorio en la revisión 48, seguido de todas las confirmaciones necesarias para obtener la revisión 50". –

+0

John: ¿cómo lo estás ejecutando? Funciona bien para mí. Vacia completamente la primera revisión especificada, luego se confirma hasta la última revisión especificada. Solo si especifica el modificador "--deltas", solo descarga las confirmaciones. –

4

¿Puedo eliminar revisiones o repositorios anteriores para liberar espacio de almacenamiento?

La respuesta corta es no. La manera en que funcionan Subversion y CVS es que mantienen un historial completo de cambios, incluidos los archivos eliminados, los archivos binarios, etc. Cada revisión depende de la última revisión, por lo que no puede simplemente cortar una revisión en el medio o corrompe su repositorio. Hay dos cosas que puede hacer si se está quedando sin espacio: 1) Elimine su módulo y recíclelo utilizando solo la revisión HEAD, que borrará todas las revisiones anteriores (pero perderá su historial de confirmaciones). 2) La mejor opción: actualizar a un plan superior :-). Este es un problema menor con Git, ya que tiene un requisito de almacenamiento del servidor mucho menor.

¿Cómo elimino completamente un archivo del historial del repositorio?

Existen casos especiales en los que es posible que desee destruir todas las pruebas de un archivo o confirmación. (Tal vez alguien accidentalmente haya confiado un documento confidencial.) Esto no es tan fácil, porque Subversion está diseñada deliberadamente para nunca perder información. Las revisiones son árboles inmutables que se construyen unos sobre otros. Eliminar una revisión de la historia provocaría un efecto dominó, creando caos en todas las revisiones posteriores y posiblemente invalidando todas las copias de trabajo.

El proyecto tiene planes, sin embargo, de implementar algún día un comando svnadmin obliterate que logre la tarea de eliminar información permanentemente. (Ver el problema 516))

Mientras tanto, su único recurso es svnadmin volcar su repositorio, luego canalizar el archivo de volcado a través de svndumpfilter (excluyendo la mala ruta) en un comando de carga svnadmin. Vea el capítulo 5 del libro de Subversion para más detalles sobre esto.

sido tomadas de:

http://subversion.apache.org/faq.html#removal

http://codesion.com/benefits/faq.htm#deleterevisions

Cuestiones relacionadas