¿Cómo puedo eliminar todos los archivos / carpetas no versionados / ignorados en mi copia de trabajo?

136

Si tengo una copia de trabajo de un repositorio de Subversion, ¿hay alguna forma 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 para git clean.

Una línea de comando o una solución GUI (para TortoiseSVN) sería aceptable.

Nick Meyer
fuente
1
Posible duplicado de Eliminar automáticamente los archivos no versionados de Subversion
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

98

Usando TortoiseSVN:

Stefan
fuente
77
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.
Nick Meyer,
55
¿La versión de línea de comando de svn (específicamente en Windows) no proporciona la misma función?
blong
3
Como sombody señaló a continuación:svn cleanup --remove-unversioned --remove-ignored .
haui
133
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:

  • Los archivos ignorados y no rastreados se eliminan
  • Funciona incluso si un nombre de archivo contiene espacios en blanco (excepto la nueva línea, pero no hay mucho que se pueda hacer al respecto que no sea usar la --xmlopción y analizar la salida xml resultante)
  • Funciona incluso si svn statusimprime otros caracteres de estado antes del nombre del archivo (que no debería porque los archivos no se rastrean, pero por si acaso ...)
  • Debería funcionar en cualquier sistema compatible con POSIX

Yo uso un script de shell llamado svncleanque 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
Richard Hansen
fuente
2
¡Exactamente lo que estaba buscando, funciona de maravilla también en Linux y MacOS!
rico
¿Necesita reiniciar el IFS? Elegí no hacer un script 'svnclean'. así que me pregunto si eso
arruinará
3
@matrixugly: No, no necesitas IFSvolver a cambiar a lo que era antes. Cuando lo haga VARNAME=value command, la asignación de valueto VARNAMEsolo se aplica durante la ejecución de command(con algunas excepciones que no se aplican a read). Consulte la especificación POSIX y este informe de error POSIX para obtener más detalles.
Richard Hansen el
@rich, gracias por compartir esto. Llegué buscando una solución de limpieza de svn hace unos años, ¡y también se fue con algunos conocimientos de scripting de shell! Evidentemente, he vuelto bastante a esta respuesta.
C. Tewalt
120

Sé que esto es antiguo, pero en caso de que alguien más se encuentre con él, las versiones más nuevas (1.9 o posteriores) de soporte svn --remove-unversioned, por ejemplo svn cleanup . --remove-unversioned.

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

Neil
fuente
18
Para mí, esta es la respuesta correcta. Es una respuesta de línea de comandos multiplataforma. Además, puede eliminar archivos ignorados consvn cleanup . --remove-ignored
Dan Atkinson
1
Funciona en svn 1.6 y superior.
pesado
2
Cambie eso a 1.9, vea también subversion.apache.org/docs/release-notes/1.9.html (Lo intenté localmente y no funcionó, y estoy en 1.8.8)
ikku100
2
Parece que el problema es que no elimina las carpetas no versionadas .
Nyerguds
1
@Nyerguds: es cierto, esto no elimina las carpetas sin versión, sino solo los archivos sin versión. ¿Ha encontrado alguien una solución?
dhiraj suvarna
42

Este oneliner puede ayudarlo a:

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

Úselo con cuidado!

jkramer
fuente
13
esto no elimina los archivos ignorados y se romperá si un nombre de archivo contiene espacios en blanco
Richard Hansen
1
Tampoco elimina archivos ignorados
plaisthos
44
Puede usar svn status --no-ignorepara capturar bien los archivos ignorados.
Codure
3
De hecho, considero que es una característica dejar en su lugar los archivos ignorados, opcionalmente.
macetw
15

Modificando las respuestas de Yanal-Yves Fargialla y gimpf usando Powershell (pero no se le permite comentar sobre la publicación original de Stackoverflow):

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

Esto agrega el quilate ("^") para especificar el inicio de la línea, evitando hacer coincidir todos los archivos que contienen la letra "i". Agregue también los indicadores de -recurse y -force a rm para que este comando no sea interactivo y pueda utilizarse en un script.

gwilk
fuente
El comando necesita una comilla doble extra al final. Solo lo agregaría, pero las ediciones deben tener al menos seis caracteres aparentemente.
Ian Miller
7

Muchas cosas en SVN se pueden hacer de diferentes maneras, como lo demuestran las variadas respuestas de la línea de comandos que se proporcionan aquí. Con el advenimiento 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, permitiéndole seleccionar archivos no versionados por separado de los archivos ignorados. Simplemente seleccione TortoiseSvn >> Clean up...para abrir este diálogo.

Opciones de limpieza de TortoiseSVN

Michael Sorens
fuente
7

Con powershell:

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

Desde la línea de comando:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
Yanal-Yves Fargialla
fuente
3
¡Me encanta este script puro de Windows! En su -match '[\?i]' -replace '^.{8}'lugar, recomendaría usar , que funciona correctamente incluso si un nombre de archivo comienza con un espacio en blanco, y también elimina los archivos ignorados.
gimpf
1
El uso del ajuste sugerido de gimpf funciona bien, pero me encontré con un caso en el que encontré un ItemNotFoundException. Resulta que solo había un único archivo en el conjunto de resultados de estado svn. Este ajuste soluciona ese problema: code@ (svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | rm `. Lo descubrí con la ayuda de esta publicación
dirtybird el
1
y porque eso le pedirá directorios que no estén en svn (ya que no se especificó recurse), no es bueno para usar en un script. Uso:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber
6

Este oneliner funciona para mí (basado en la respuesta de Richard Hansen, que sorprendentemente no funcionó para archivos que contienen espacios):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
Dennis Golomazov
fuente
2
para eliminar carpetas no versionadas también, agregue -fral rmcomando: svn status --no-ignore | grep '^ [I?]' | corte -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov
5

Usando TortoiseSVN:

  1. Haga clic derecho en la raíz de la copia de trabajo y seleccione TortoiseSVN -> "buscar modificaciones"
  2. Seleccione "Mostrar archivos ignorados"
  3. Ordenar por columna "Estado del texto"
  4. desplácese a los archivos "no versionados", ahora todos agrupados; selecciónelos todos y haga clic derecho -> eliminar
  5. desplazarse a los archivos "ignorados", ahora todos agrupados; selecciónelos todos y haga clic derecho -> eliminar

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

Gracias a pkh por el consejo con los archivos ignorados.

Thomas Lötzer
fuente
Creo que esto solo eliminará los archivos no versionados. Los elementos ignorados no se verán afectados.
Dirk Vollmar
2
No necesita usar 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
4

Esto es similar a otras respuestas, pero en realidad obtiene archivos ignorados (tenga en cuenta la 'I' en los RE):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
pkh
fuente
1
esto se rompe si un nombre de archivo contiene espacios en blanco
Richard Hansen
4

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

Toro.

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. :)

ChokesMcGee
fuente
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")
Darien Pardinas
@DarienPardinas, su versión es especialmente útil si se conecta a un "comando por lotes Ejecutar Windows" de Jenkins, que acabo de enterar que no es un símbolo del sistema, sino más bien un script por lotes, por lo tanto, la necesidad de %%over%
jxramos