2010-01-12 29 views
32

¿Hay alguna manera de eliminar el archivo del repositorio svn, incluido todo su historial? Este problema surge cuando quiero deshacerme del gran archivo binario que reside en el repositorio.Eliminar archivo con todo el historial del repositorio svn

sé sólo un método que podría ayudar en esta situación:

  1. volcado toda cesión temporal con la ayuda de svnadmin utilidad.
  2. Filtro de archivo volcado con grep. Grep debe utilizar el nombre de archivo y escribir en el otro archivo de volcado
  3. importación último archivo de volcado con svnadmin

Pero esto es demasiado complicado y poco fiable. Tal vez hay otra solución?

Respuesta

6

Pero esto es demasiado complicado y poco confiable.

No sé por qué esto no se debe considerar confiable. Sin embargo, si quiere deshacerse por completo del archivo, el historial y todo, sin importar el efecto en las revisiones previas de las que este archivo era parte, solo hay una forma de hacerlo y de hecho es complicado. Y con razón. SVN es una herramienta con un único objetivo: nunca perder ningún archivo, incluso después de haber sido eliminado. Forzarlo a hacer lo contrario debería ser difícil.

29

Esto se ha convertido recientemente en mucho más sencillo con el comando svndumpfilter. Los detalles están disponibles en la documentación de subversión here. Básicamente, para evitar conflictos (se explica here), se necesita un volcado de repositorio y se rehace cada confirmación, que incluye o excluye un prefijo de archivo determinado. sintaxis básica:

svndumpfilter exclude yourfileprefix <yourdump> yournewdump 

Excluir es probablemente lo que la pregunta está en busca de autor de la pregunta, pero también se puede utilizar para incluir, por ejemplo, extraer un sub-árbol de la cesión temporal con el fin de hacer girar apagado como su propio repositorio.

La última revisión de subversión en subversión (muy meta) también puede tomar patrones glob. Recientemente tuve que eliminar todos los archivos PDF a partir de un acuerdo de recompra y fue hecho con mucha facilidad, así:

svndumpfilter exclude --pattern '*.pdf' <dump> dump_nopdfs 

Información uso se pueden encontrar llamando svndumpfilter help y svndumpfilter help exclude.

+0

Así que todo el proceso sería: 'svnadmin dump> myDump; svndumpfilter excluye myFile < myDump > newDump; gato nuevoDump | svnadmin load myRepositoryURL; ¿Correcto? – Shawn

+0

No lo he probado, pero parece correcto. –

+10

Ok, lo probé y el proceso se ve más o menos así: 'svnadmin dump path_to_repository> old.dump; svndumpfilter excluye file_prefix < old.dump > new.dump; rm -rf path_to_repository; svnadmin create path_to_repository; svnadmin load path_to_repository Shawn

3

Me enfrentaba a un problema similar, excepto que necesitaba eliminar varios archivos, no solo un archivo, y también estamos en Subversion 1.6, que no es compatible con la directiva --patern.

- copia de seguridad actual SVN

$ cp -R /svn /svnSAVE 

- repositorio volcado

$ svnadmin dump /svn/root > svnDump 

- crear nuevo vertedero mientras se excluye el archivo muy grande

$ svndumpfilter exclude "/path/file.csv" <svnDump> newSvnDump0 
-- {note: should see a message like this}: 
--   Dropped 1 node: 
--     '/path/file.csv' 

- crear otra nueva volcar excluyendo otro archivo muy grande

$ svndumpfilter exclude "/path/anotherFile.csv" <newSvnDump0> newSvnDump1 

- quitar la vieja SVN

$ rm -rf /svn 

- volver a crear los directorios SVN

$ mkdir -p /svn/root 

- recrear el SVN

$ svnadmin create /svn/root 

- repoblar el repositorio fresco con el volcado

$ cat newSvnDump1 | svnadmin load /svn/root 

- actualizar los archivos de conf de la copia guardada en la nueva copia ...

$ cp /svnSAVE/root/conf/* /svn/root/conf 

Ahora el repositorio no debe contener los archivos de gran tamaño 2 "file.csv" y "anotherFile.csv"

0

Estoy de acuerdo con la propuesta de McDowell, pero me gustaría sugerir que considere reemplazar el archivo grande con un archivo de texto que simplemente contenga el hash del archivo de la entrada eliminada.

Si tiene una gran cantidad de, por ejemplo, archivos .o que se comprueban accidentalmente en un directorio de compilación, esto puede no ser apropiado. Pero si está eliminando un conjunto de artefactos binarios que no desea de un directorio que incluye un conjunto de artefactos binarios que usted quiere, tiene un alto riesgo de cometer un error costoso. Como mínimo, considere eliminarlos del tronco y de la mayoría de las ramas, pero dejando una rama de características llena de archivos de texto de marcador de posición con el hash del binario original. Esto al menos puede ser suficiente para descubrir lo que sucedió más tarde, verificar que una copia perdida que no debería haberse eliminado sea de hecho el archivo correcto y volver a ponerla bajo control de revisión.

Y, obviamente, respalda todo el repositorio hasta algo de solo lectura, como un par de M-Discos o algo así, incluso antes de pensar en hacer cualquiera de estas cosas.

Cuestiones relacionadas