svn - comandos - ¿Cómo puedo eliminar todos los archivos/carpetas no versionados/ignorados en mi copia de trabajo?
comandos svn (12)
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. :)
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 para git clean
.
Ya sea una línea de comando o una solución GUI (para TortoiseSVN) sería aceptable.
Con powershell:
(svn status --no-ignore) -match ''[?]'' -replace ''^./s+'' | rm
Desde línea de comando:
powershell -Command "&{(svn status --no-ignore) -match ''[?]'' -replace ''^./s+'' | rm}"
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 {}
Este oneliner puede ayudarte:
$ svn status | grep ''^?'' | awk ''{print $2}'' | xargs rm -rf
¡Use con cuidado!
Esto es similar a otras respuestas, pero en realidad obtiene archivos ignorados (observe la ''I'' en los RE):
rm -rf `svn status --no-ignore | grep ''^[/?I]'' | sed ''s/^[/?I]//''`
Modificando las respuestas de Yanal-Yves Fargialla y gimpf usando Powershell (pero no se permite comentar en la publicación original de ):
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 coincidir con 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.
Muchas cosas en SVN se pueden hacer de diferentes maneras, como lo demuestran las diversas respuestas de línea de comando que se dan 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.
Sé que esto es antiguo, pero en caso de que alguien más se tope con él, las versiones más recientes (1.9 o posteriores) del soporte svn --remove-unversioned
, por ejemplo, svn cleanup . --remove-unversioned
svn cleanup . --remove-unversioned
.
https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options
Usando TortoiseSVN:
- Haga clic con el botón derecho en la raíz de la copia de trabajo y seleccione TortoiseSVN -> "verificar modificaciones"
- Seleccione "Mostrar archivos ignorados"
- Ordenar por la columna "Estado del texto"
- desplácese a los archivos "sin versión", ahora todos agrupados; seleccionarlos todos y hacer clic con el botón derecho -> eliminar
- desplácese a los archivos "ignorados", ahora todos agrupados; seleccionarlos todos y hacer clic con el botón 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.
Usando TortoiseSVN:
- haga clic derecho en la carpeta de copia de trabajo, mientras mantiene presionada la tecla de mayúsculas
- elige "eliminar elementos no versionados"
no se puede eliminar con solo la línea de comando SVN (aunque no estoy seguro de las herramientas de la GUI), si se está bajo el sistema Linux esto podría ayudar:
http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/
El otro método (brutal) es realizar cambios, eliminar todo de la carpeta y pagar de nuevo.
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:
- Se eliminan los archivos ignorados y no rastreados
- Funciona incluso si el nombre de un archivo contiene espacios en blanco (a excepción de la nueva línea, pero no hay mucho que se pueda hacer aparte de usar la opción
--xml
y analizar la salida xml resultante) - Funciona incluso si el
svn status
imprime otros caracteres de estado antes del nombre del archivo (que no debería porque los archivos no están rastreados, pero por si acaso ...) - Debería funcionar en cualquier sistema compatible con POSIX
Uso un script de shell 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