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:
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.
¿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.
Ejecuta un estado svn
Busque líneas que comienzan con "!" (desaparecido)
Imprima el "--force" (argumento svn) y la segunda columna (el nombre del archivo) de la salida del # 2
Ejecutar svn rmusando la salida del # 3 como argumentos
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
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
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
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)
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
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
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:
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 rm
en 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).
fuente
svn up
? porque los archivos se restauran desde el servidor svnSi está utilizando Mac ( Darwin ) o Linux, puede canalizar las salidas de los siguientes comandos
svn rm
para 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 rm
usando la salida del # 3 como argumentosEntonces el comando completo es:
Referencias
fuente
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)--force
en la parte xargs?svn status
svn remove
cada archivofuente
-r
a lasxargs
opciones (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\n
como delimitador y dejar citar axargs
: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 :
fuente
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.list
archivo 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.
fuente
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.list
a 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:
fuente
Una alternativa que funciona en Linux (bash) para archivos a eliminar que no contienen espacios en la ruta:
fuente
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".fuente
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:
fuente
En realidad, es posible eliminar por completo el
missing.list
usuario3689460 y Paul Martinfuente
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:
fuente
Versión mejorada
Entonces el comando completo es:
fuente