Comando SVN para eliminar todos los archivos que faltan localmente

134

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

Wheresrhys
fuente
1
Mantengo 1 carpeta de trabajo y 1 carpeta de pago. Y mueva solo los archivos de la carpeta de trabajo a la carpeta de salida. Si se debe agregar / eliminar una carpeta, lo hago manualmente y luego muevo los archivos a esa carpeta (por ejemplo, paquetes nuevos, paquetes antiguos). La mayoría de los problemas de svn ocurren cuando mueve carpetas en su copia de trabajo. Incluso al copiar archivos de su copia de trabajo a la copia de pago, solo debe mover archivos, no carpetas.
Siddharth

Respuestas:

99

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

Michael Sorens
fuente
¿Hay alguna manera en eclipse usando el complemento subclipse? es tan malo actualizar y luego encontrarlos en el proyecto y eliminarlos nuevamente.
Stan
Para su información, si se necesita una contraseña de subversión, aquí está la sintaxis: svn status --username user_name_here --password password_here | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Coincidencias [1] - nombre de usuario nombre_usuario_aquí - contraseña contraseña_aquí}
Jeff
¿Deberías comprometerte después de esta línea antes de ejecutar svn up? porque los archivos se restauran desde el servidor svn
Pierre
¿Esta acción eliminará también los archivos del repositorio?
Sebastián Ulloa
175

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.

  1. Ejecuta un estado svn
  2. Busque líneas que comienzan con "!" (desaparecido)
  3. Imprima el "--force" (argumento svn) y la segunda columna (el nombre del archivo) de la salida del # 2
  4. Ejecutar svn rmusando la salida del # 3 como argumentos

Entonces el comando completo es:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

Referencias

Peter Ajtai
fuente
44
Esto no funciona si hay espacios en el nombre del archivo. Sin embargo, no sé lo suficiente como para arreglarlo.
bugloaf
2
Úselo awk '{print " --force "$2"@"}'si su nombre de archivo contiene un @(si es un desarrollador de iOS, por ejemplo)
Guillaume Algis
1
Y manejar un nombre de archivo con espacios en blanco, awk '{$1=""; print " --force \""substr($0,2)"@\"" }'debe hacer el truco (y comienza a verse feo)
Guillaume Algis
12
El comando completo que se ocupa del espacio es "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "" substr ($ 0,2) "@ \" "}' | xargs svn rm "
HelloWorld
1
¿Por qué no pones el --forceen la parte xargs?
jwg
53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. Filtra solo en archivos faltantes
  3. Cortar el signo de exclamación
  4. Filtra los espacios en blanco finales
  5. Añadir presupuesto inicial
  6. Añadir presupuesto final
  7. svn remove cada archivo
ivrin
fuente
Esta solución funciona si hay espacios en los archivos / directorios.
yuric
¿Cómo se agrega verbosidad a esto? xargs -verbose svn rm?
TekiusFanatikus
1
Solo una pista para los usuarios de scripts, etc., este comando falla si no se encuentran archivos para eliminar: svn: E205001: Intente 'svn help delete' para obtener más información svn: E205001: No se proporcionaron suficientes argumentos
Thorsten Schöning
1
El problema de @ ThorstenSchöning se puede solucionar agregando -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
Haui
19

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
usuario3689460
fuente
es bueno ver que aún aparece un innovador código de lote :)
user230910
Wow, gran respuesta. Estaba a punto de usar Powershell, pero esto fue mucho más fácil.
Jim Andrakakis
Agregué otra línea después 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í
Pierre
Modifiqué este script para intentar ejecutarlo desde una ubicación arbitraria y luego encontré este problema stackoverflow.com/questions/1137219/… por lo que parece que DEBES usar el directorio de trabajo actual para realizar esta acción.
aolszowka
7

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)
Paul Martin
fuente
5

Una alternativa que funciona en Linux (bash) para archivos a eliminar que no contienen espacios en la ruta:

svn delete `estado de svn | grep! El | awk '{print $ 2}' '
gilyen
fuente
4

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
cibercitizen1
fuente
4

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
Stefano Bossi
fuente
4

En realidad, es posible eliminar por completo el missing.listusuario3689460 y Paul Martin

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
Énfasis
fuente
para referencia - esto es DOS / cmd.exe en Windows
Land
2

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
Jonas Eberle
fuente
1

Versión mejorada

Entonces el comando completo es:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
Zeta
fuente