2010-05-10 12 views
114

Si tengo una copia de trabajo de un repositorio de Subversion, ¿hay alguna manera de eliminar todos los archivos no versionados o ignorados en esa copia de trabajo con un solo comando o herramienta? Básicamente, estoy buscando el análogo SVN a git clean.¿Cómo puedo eliminar todos los archivos/carpetas no versionados/ignorados en mi copia de trabajo?

Se aceptará una línea de comando o una solución GUI (para TortoiseSVN).

+0

Posible duplicado de [eliminar automáticamente los archivos sin versión de Subversion] (http://stackoverflow.com/questions/239340/automatically-remove-subversion-unversioned-files) –

Respuesta

91

utilizando TortoiseSVN:

+7

¡Buena característica! Sin embargo, tuve que leer el enlace para descubrir que solo funciona en la vista de lista (no en la vista de árbol) en XP, tal vez debería incluir eso en su respuesta. –

+5

¿La versión de línea de comando de svn (específicamente en Windows) no proporciona la misma función? – blong

+1

@blong: No, no puede hacer esto desde la línea de comandos de Windows. – Josh

34

Este oneliner pueden ayudar:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf 

uso con cuidado!

+13

esto no elimina ficheros ignorados y voluntad romper si un nombre de archivo contiene espacios en blanco –

+1

Tampoco borra los archivos ignorados – plaisthos

+4

Puede usar 'svn status --no-ignore' para capturar los archivos ignorados un pocillo. –

4

Esto es similar a otras respuestas, pero en realidad recibe ficheros ignorados (tenga en cuenta el 'yo' en las EMT):

rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'` 
+1

esto se rompe si un nombre de archivo contiene espacios en blanco –

5

utilizando TortoiseSVN:

  1. haga clic derecho en la raíz de la copia de trabajo y seleccione TortoiseSVN -> "comprobar si hay modificaciones"
  2. Seleccione "Mostrar todos los archivos ignorados"
  3. Ordenar por "estado del texto" columna
  4. desplácese a los archivos "sin versión", ahora todos agrupados; selecciónelos a todos y haga clic con el botón derecho en -> eliminar
  5. desplazarse a los archivos "ignorados", ahora todos agrupados; selecciónalos todos y haz clic derecho -> eliminar

No es realmente una solución agradable y limpia, pero la forma más rápida que conozco (en Windows).

Gracias a pkh por la punta con los archivos ignorados.

+0

Creo que esto solo eliminará los archivos no versionados. Los elementos ignorados no se verán afectados. –

+0

@ 0xA3 cierto, editaré la respuesta. Gracias por la sugerencia –

+2

No necesita utilizar el diálogo de confirmación, y puede obtener archivos ignorados: haga clic con el botón derecho | TortoiseSVN | Verificar modificaciones Luego puede hacer clic en 'Mostrar archivos ignorados' y ordenar/eliminar adecuadamente. – pkh

116
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done 

Esto tiene las siguientes características:

  • Ambos ignorados y archivos sin seguimiento se eliminan
  • Funciona incluso si un nombre de archivo contiene espacios en blanco (con excepción de salto de línea, pero no hay mucho que se pueda hacer al respecto aparte de utilizar la opción --xml y analizar la salida XML resultante)
  • funciona incluso si svn status imprime otros caracteres de estado antes del nombre del archivo (que no debería porque no se rastrean los archivos, pero por si acaso ...)
  • que debería funcionar en cualquier sistema compatible con POSIX

Yo uso un script llamado svnclean que contiene lo siguiente:

#!/bin/sh 

# make sure this script exits with a non-zero return value if the 
# current directory is not in a svn working directory 
svn info >/dev/null || exit 1 

svn status --no-ignore | grep '^[I?]' | cut -c 9- | 
# setting IFS to the empty string ensures that any leading or 
# trailing whitespace is not trimmed from the filename 
while IFS= read -r f; do 
    # tell the user which file is being deleted. use printf 
    # instead of echo because different implementations of echo do 
    # different things if the arguments begin with hyphens or 
    # contain backslashes; the behavior of printf is consistent 
    printf '%s\n' "Deleting ${f}..." 
    # if rm -rf can't delete the file, something is wrong so bail 
    rm -rf "${f}" || exit 1 
done 
+2

¡Exactamente lo que estaba buscando, funciona como un encanto también en Linux y MacOS! – rich

+0

¿Necesita restablecer el IFS? Elegí no hacer un script 'svnclean'. así que me pregunto si eso arruinará a IFS por el resto del guión ... – matrixugly

+3

@matrixugly: No, no necesita cambiar 'IFS' a lo que era antes. Cuando haces 'VARNAME = value command', la asignación de' value' a 'VARNAME' solo se aplica durante la ejecución de' command' (con algunas excepciones que no se aplican a 'read'). Ver [la especificación POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09) y [este informe de errores POSIX] (http://austingroupbugs.net/view.php?id = 654 # c1559) para más detalles. –

7

Muchas cosas en SVN se puede hacer de diferentes maneras, como se evidenciado por las variadas respuestas de línea de comando dadas aquí. Con la llegada de la versión 1.7 hay otra técnica para TortoiseSVN que, de hecho, proporciona una resolución de grano más fina que la respuesta de Stefan, lo que le permite seleccionar archivos no versionados por separado de los archivos ignorados. Simplemente seleccione TortoiseSvn >> Clean up... para abrir este cuadro de diálogo.

TortoiseSVN cleanup options

7

Con PowerShell:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm 

Desde la línea de comandos:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}" 
+3

¡Me encanta este script puro de Windows! Yo recomendaría usar '-match '[\? I]' -replace '^. {8}' 'en su lugar, que funciona correctamente incluso si un nombre de archivo _comenza_ con un espacio en blanco, y también elimina los archivos ignorados. – gimpf

+1

Usar el tweak sugerido de gimpf funciona bien, pero me encontré con un caso en el que encontré una excepción ItemNotFoundException. Resulta que solo había un solo archivo en el conjunto de resultados del estado svn. Este ajuste corrige ese problema: 'code' @ (svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | rm '. Lo descubrí con la ayuda de [esta publicación] (http://stackoverflow.com/questions/8651905/powershell-match-operator-returns-true-but-matches-is-null) – dirtybird

+1

y porque eso le solicitará directorios no en svn (ya que no se especificó recurse), no sirve para usar en un script. Uso: 'powershell -Command" & {(svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | remove-item -force -recurse} "' – thinkOfaNumber

5

Este oneliner funciona para mí (en base a la respuesta de Richard Hansen, que sorprendentemente no funciona para los archivos que contienen espacios):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {} 
+1

para eliminar carpetas no versionadas también, agregue el comando '-fr' a' rm': svn status --no-ignore | grep '^ [I?]' | corte -c 9- | xargs -d "\ n" -I {} rm -fr {} –

14

Modificación Yanal-Yves Fargialla y respuestas de gimpf uso de PowerShell (pero no está permitido hacer comentarios sobre el post original por Stackoverflow):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force} 

Esto añade el quilate ("^") para especificar el comienzo de la línea , evitando hacer coincidir todos los archivos que contienen la letra "i". También agregue los indicadores para -recurse y -force a rm para que este comando no sea interactivo y se pueda usar en un script.

+0

El comando necesita una comilla doble adicional al final. Solo lo agregaría, pero las ediciones tienen que tener al menos seis caracteres aparentemente. –

4

Alguien dijo que no puede hacerlo desde la línea de comandos de Windows.

Bull.

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I") 

Lo hace en una línea y no requiere una sola herramienta GNU. :)

+0

'for/f" tokens = 2 delims = "%% I IN ('svn st --no-ignore^| findstr/R"^[I?] "') DO (DEL/S/F/Q/A : H "%% I" & rmdir/S/Q "%% I") ' –

+0

@DarienPardinas, su versión es especialmente útil si conecta un Jenkins" Ejecute el comando de lote de Windows ", que acabo de enterar no es un símbolo del sistema pero más como un script por lotes, por lo tanto, la necesidad de '%%' sobre '%' – jxramos

63

Sé que esto es viejo, pero en caso de que alguien más se tope con él, las versiones más recientes (1.9 o posterior) de svn admiten --remove-unversioned, p. svn cleanup . --remove-unversioned.

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options

+12

Para mí, esta es la respuesta correcta. Es una respuesta de línea de comando multiplataforma. Además, puede eliminar archivos ignorados con 'svn cleanup. --remove-ignored' –

+1

Funciona en svn 1.6 y superior. – wegry

+1

Cambie eso en 1.9, vea también https://subversion.apache.org/docs/release-notes/1.9.html (Intenté localmente y no funcionó, y estoy en 1.8.8) – ikku100

Cuestiones relacionadas