eliminar - svn comandos
Comando SVN para eliminar todos los archivos que faltan localmente (11)
Acabo de encontrar esto, que hace el truco, eliminar todos los archivos "perdidos" de una copia de trabajo SVN :
svn rm $( svn status | sed -e ''/^!/!d'' -e ''s/^!//'' )
En SVN, ¿hay algún comando que pueda usar para eliminar todos los archivos que faltan localmente en un directorio?
O en su defecto, alguna forma de enumerar solo aquellos archivos que faltan (o, en el caso más general, tienen el estado A, D,?, Etc.)
Cuando se trata de una gran cantidad de archivos, puede suceder que el argumento de entrada a xargs sea demasiado largo. Fui a una implementación más ingenua que también funciona en ese caso.
Esto es para Linux:
#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status $1 | grep -E ''^!'' | awk ''{print $2}'')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
echo $MISSING_PATH
svn rm --force "$MISSING_PATH"
done
En realidad, es posible eliminar por completo la lista de missing de user3689460 y Paul Martin
for /F "tokens=* delims=! " %%A in (''svn status ^| findstr /R "^!"'') do (svn delete "%%A")
Este script de shell examina de forma recursiva directorios ( svn status
) en su proyecto, elimina los archivos que faltan (como exige la pregunta) y agrega nuevos archivos al repositorio. Es una especie de "almacenar en el repositorio la instantánea actual del proyecto".
if [ $# != 1 ]
then
echo "usage: doSVNsnapshot.sh DIR"
exit 0
fi
ROOT=$1
for i in `find ${ROOT} -type d /! -path "*.svn*" `
do
echo
echo "--------------------------"
( cd $i ;
echo $i
echo "--------------------------"
svn status | awk ''
/^[!]/ { system("svn rm " $2) }
/^[?]/ { system("svn add " $2) }
''
)
echo
done
Gracias a Paul Martin por la versión de Windows.
Aquí hay una ligera modificación del script para que los archivos de Windows con espacios también se tengan en cuenta. Además, el archivo missing.list
se eliminará al final.
Guardé lo siguiente en svndel.bat en mi directorio SVN bin (establecido en mi entorno %% PATH) para que pueda ser llamado desde cualquier carpeta en el símbolo del sistema.
### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL
Me gusta la opción de PowerShell ... Pero esta es otra opción si usa scripts de lotes de Windows:
svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
Si está utilizando Mac ( Darwin ) o Linux, puede canalizar las salidas de los siguientes comandos a svn rm
para todos los archivos que faltan. Puede configurar el directorio de trabajo actual en el directorio o subdirectorio apropiado antes de ejecutarlos, dependiendo de si desea ejecutar esta toda su copia de trabajo o solo un subconjunto.
- Ejecutar un estado svn
- Busque las líneas que comienzan con "!" (desaparecido)
- Imprima la "--force" (argumento svn) y la segunda columna (el nombre del archivo) de la salida de # 2
- Ejecute
svn rm
usando la salida de # 3 como argumentos
Entonces el comando completo es:
svn st | grep ^! | awk ''{print " --force "$2}'' | xargs svn rm
Referencias
Una alternativa que funciona en Linux (bash) para que los archivos sean eliminados que no contienen espacios en la ruta:
svn delete `svn status | grep ! | awk ''{print $2}''`
Una ligera modificación de la línea de comandos, que funciona en Mac OS (afortunadamente incluso en Linux) y hace frente a los archivos que informa el comando "svm sr", como "! M" (faltante y modificado).
Hace frente a espacios en los archivos.
Se basa en una modificación de una respuesta anterior:
svn st | grep ! | sed ''s/!M/!/'' | cut -d! -f2| sed ''s/^ *//'' | sed ''s/^/"/g'' | sed ''s/$/"/g'' | xargs svn --force rm
Si está utilizando TortoiseSVN, simplemente haga una Verificación de modificaciones , ordene por la columna Estado , seleccione todas las entradas marcadas como missing
, haga clic con el botón derecho para abrir el menú contextual y seleccione Eliminar . Finalmente, comprométase a publicar los cambios en el repositorio.
Si estás en Windows, pero prefieres la línea de comandos y disfrutas incursionando en PowerShell, este one-liner hará el truco:
svn status | ? { $_ -match ''^!/s+(.*)'' } | % { svn rm $Matches[1] }
Es decir, filtra la salida solo a aquellas líneas que muestran los archivos que faltan (indicados por un signo de exclamación al comienzo de la línea), captura el nombre de archivo asociado y ejecuta una svn rm
en ese nombre de archivo.
(Publicación del blog Elimine todos los archivos "faltantes" de una copia de trabajo SVN que hace algo similar para Unix / Linux.)
svn st | grep ! | cut -d! -f2| sed ''s/^ *//'' | sed ''s/^/"/g'' | sed ''s/$/"/g'' | xargs svn rm
-
svn status
- Filtra solo en archivos perdidos
- Recortar el signo de exclamación
- Filtra los espacios en blanco al final
- Añadir cita líder
- Añadir cita final
-
svn remove
cada archivo