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 los archivos que faltan (o, en el caso más general, tienen el estado A, D,?, Etc.)
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 los archivos que faltan (o, en el caso más general, tienen el estado A, D,?, Etc.)
Respuestas:
Si está utilizando TortoiseSVN, simplemente haga una comprobación de modificaciones , ordene por la columna Estado , seleccione todas las entradas marcadas 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 truco hará el truco:
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
Es decir, filtre la salida solo a aquellas líneas que muestren los archivos que faltan (denotado por una exclamación al comienzo de la línea), capture el nombre del archivo asociado y realice una svn rmen ese nombre de archivo.
(La publicación de blog Eliminar todos los archivos "faltantes" de una copia de trabajo SVN hace algo similar para Unix / Linux).
svn up? porque los archivos se restauran desde el servidor svn
Si está utilizando Mac ( Darwin ) o Linux, puede canalizar las salidas de los siguientes comandos svn rmpara todos los archivos que faltan. Puede establecer el directorio de trabajo actual en el directorio o subdirectorio apropiado antes de ejecutarlos, dependiendo de si desea ejecutar esta copia de trabajo completa o solo un subconjunto.
svn rmusando la salida del # 3 como argumentosEntonces el comando completo es:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
Referencias
awk '{print " --force "$2"@"}'si su nombre de archivo contiene un @(si es un desarrollador de iOS, por ejemplo)
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'debe hacer el truco (y comienza a verse feo)
--forceen la parte xargs?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn statussvn remove cada archivo-ra las xargsopciones (no ejecutar, si no se dan argumentos). Además, el número de argumentos debe ser limitado y las eliminaciones deben agruparse porque la invocación falla con un gran número de archivos para eliminar, por ejemplo -n 500. Y por último pero no menos importante, la citando a realizar es subóptima para los archivos que contienen la cáscara especiales como $- un mejor uso \ncomo delimitador y dejar citar a xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
Acabo de encontrar esto, que hace el truco, eliminar todos los archivos "faltantes" de una copia de trabajo SVN :
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
Gracias a Paul Martin por la versión de Windows.
Aquí hay una ligera modificación en el script para que también se tengan en cuenta los archivos de Windows con espacios. Además, el missing.listarchivo se eliminará al final.
Guarde lo siguiente en svndel.bat en mi directorio bin SVN (establecido en mi entorno %% PATH) para que pueda llamarse 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
del missing.list 2>NUL, porque agregué todos los archivos nuevos directamente después de eliminar primero los archivos eliminados, por lo que agregó missing.lista svn: svn delete "missing.list"funcionó para mí
Me gusta la opción PowerShell ... Pero aquí hay otra opción si está utilizando scripts por lotes de Windows:
svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
Este script de shell examina de forma recursiva ( svn status) los directorios de su proyecto, elimina los archivos faltantes (como lo 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
Una ligera modificación de la línea de comando, que funciona en Mac OS (con suerte incluso en Linux) y hace frente a los archivos que el comando "svm sr" informa, como "! M" (falta 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
Cuando se trata con una gran cantidad de archivos, puede suceder que la entrada de argumento a xargs sea demasiado larga. Fui por 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