subversion - svn tortoise import
¿Hay un comando de Subversion para restablecer la copia de trabajo? (9)
Para eliminar archivos sin seguimiento
Pude enumerar todos los archivos sin seguimiento informados por svn st
in bash haciendo:
echo $(svn st | grep -P "^/?" | cut -c 9-)
Si te sientes afortunado, puedes reemplazar echo
por rm
para eliminar archivos sin seguimiento. O copie los archivos que desea eliminar a mano, si se siente con menos suerte.
(Utilicé la respuesta de @ abe-voelker para revertir los archivos restantes: https://stackoverflow.com/a/6204601/1695680 )
¿Hay un único comando de Subversion que "restablecería" una copia de trabajo exactamente al estado que está almacenado en el repositorio? Algo así como el (¡ja, el restablecimiento de Git duro no elimina los archivos no versionados!) git reset --hard
orm -rf wc && svn co <url> wc
.
Actualización: no busco una reversión simple, ya que eso no elimina los archivos adicionales en la copia de trabajo. Realmente quiero algo que sería lo mismo que borrar la copia de trabajo y revisarla nuevamente, solo sin tener que volver a descargar los datos. (Obviamente no me importa perder todos los cambios no confirmados).
Para revertir los archivos rastreados
svn revert . -R
Para limpiar archivos sin seguimiento
svn status | rm -rf $(awk ''/^?/{$1 = ""; print $0}'')
El -rf
puede / debe parecer aterrador al principio, pero una vez entendido, no será por estas razones:
- Solo los directorios totalmente sin seguimiento coincidirán con el patrón pasado a la
rm
- Se requiere
-rf
, de lo contrario, estos directorios no se eliminarán
Para revertir, luego limpiar (la pregunta OP)
svn revert . -R && svn status | rm -rf $(awk ''/^?/{$1 = ""; print $0}'')
Para una facilidad de uso consistente
Agrega un alias permanente a tus .bash_aliases
alias svn.HardReset=''read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print /$2}") <(svn status) ;)''
Eliminar la copia de trabajo del sistema operativo y revisarlo de nuevo es más simple, pero obviamente no es un solo comando.
Elimine todo dentro de su copia local usando:
rm -r your_local_svn_dir_path/*
Y revierte todo recursivamente usando el siguiente comando.
svn revert -R your_local_svn_dir_path
Esto es mucho más rápido que eliminar todo el directorio y luego realizar un nuevo proceso de pago, ya que los archivos se restauran desde los metadatos SVN locales. Ni siquiera necesita una conexión de red.
Muy rápido y simple y hace exactamente lo que quieres
svn status | awk ''{if($2 !~ /(config|/.ini)/ && !system("test -e /"" $2 "/"")) {print $2; system("rm -Rf /"" $2 "/"");}}''
El /(config|.ini)/ es para mis propios fines.
Y podría ser una buena idea agregar --no-ignore al comando svn
Solución pura de cmd / bat de Windows:
svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in (''svn status --no-ignore'') Do (
If [%%A]==[?] ( Call :UniDelete %%B
) Else If [%%A]==[I] Call :UniDelete %%B
)
svn update .
goto :eof
:UniDelete delete file/dir
IF EXIST "%1/*" (
RD /S /Q "%1"
) Else (
If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof
Usted puede revertir recursivamente así:
svn revert --recursive .
No hay forma (sin escribir un script creativo) de eliminar cosas que no están bajo control de fuente. Creo que lo más cercano que se puede hacer es iterar sobre todos los archivos, usar luego grep el resultado de svn list
, y si el grep falla, entonces eliminarlo.
EDIT : la solución para el script de creatividad está aquí: eliminar automáticamente los archivos no versionados de Subversion
De modo que podría crear un script que combine una revert
con la respuesta que mejor se ajuste a la pregunta vinculada.
Eliminar archivos no versionados y revertir cualquier cambio:
svn revert D:/tmp/sql -R
svn cleanup D:/tmp/sql --remove-unversioned
Fuera:
D D:/tmp/sql/update/abc.txt
svn revert . -R
para reiniciar todo
svn revert path/to/file
para un solo archivo