¿Existe un comando de Subversion para restablecer la copia de trabajo?

110

¿Existe un solo comando de Subversion que “restablezca” una copia de trabajo exactamente al estado que está almacenado en el repositorio? Algo como git reset --hardo (¡ja, el restablecimiento completo de Git tampoco elimina los archivos no versionados!) rm -rf wc && svn co <url> wc.

Actualización: no busco una reversión simple, ya que eso no elimina archivos adicionales en la copia de trabajo. Realmente quiero algo que sea lo mismo que eliminar la copia de trabajo y verificarla nuevamente, solo que sin tener que descargar los datos nuevamente. (Obviamente, no me importa perder todos los cambios no confirmados).

zoul
fuente
revirtiendo todos los cambios en la copia de trabajo?
mauris
5
Lo usaría git clean -xdfpara eliminar cosas que no están bajo control de fuente.
vcsjones
1
@vcsjones: Gracias, la página de manual de git cleancitas es exactamente lo que estoy buscando: "Esto se puede usar (posiblemente junto con git reset) para crear un directorio de trabajo impecable para probar una compilación limpia". Lástima que Subversion no parezca tener nada como esto incorporado.
zoul

Respuestas:

180

Puede revertir de forma recursiva así:

svn revert --recursive .

No hay forma (sin escribir un guión creativo) de eliminar cosas que no están bajo el control de la fuente. Creo que lo más cercano que puede hacer es iterar sobre todos los archivos, usar y luego grep el resultado de svn list, y si el grep falla, eliminarlo.

EDITAR : La solución para el script creativo está aquí: Elimine automáticamente los archivos no versionados de Subversion

Por lo tanto, podría crear un guión que combine a revertcon la respuesta de la pregunta vinculada que más le convenga.

vcsjones
fuente
3
Es posible que también desee ejecutar svn cleanupen el wc primero. Esta es mi práctica estándar para limpiar después de fusiones abortadas y todo eso.
Mike Miller
tortuga también tiene una opción "eliminar archivos no versionados" en el diálogo de limpieza.
v.oddou
2
Sería bueno si "eliminar archivos no versionados" estuviera disponible a través de la línea de comandos. Especialmente para compilaciones automatizadas.
C. Tewalt
3
Vea mi respuesta ... --remove-unversioned existe para la limpieza de svn
Denny Weinberg
38

Para revertir archivos rastreados

svn revert . -R

Para limpiar archivos sin seguimiento

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

El -rfpuede / debería parecer aterrador al principio, pero una vez entendido no será por estas razones:

  1. Solo los directorios totalmente sin seguimiento coincidirán con el patrón pasado rm
  2. Se -rfrequiere, de lo contrario, estos directorios no se eliminarán

Para revertir y luego limpiar (la pregunta OP)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Para una facilidad de uso constante

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) ;)'
Niklauzg
fuente
el segundo fragmento no parece funcionar para mí:awk: fatal: error reading input file '-': Input/output error
hbogert
Tenía que escapar de la ?en el awkcomando, de lo contrario corresponde todas las líneas en la salidasvn status
gpanders
23

Elimine todo dentro de su copia local usando:

rm -r your_local_svn_dir_path/*

Y revertir todo de forma recursiva 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 pago nuevo, porque los archivos se están restaurando desde sus metadatos SVN locales. Ni siquiera necesita una conexión de red.

Vivek Yadav
fuente
4
mucho más rápido es svn cleanup --remove-unversioned.
Znik
7
svn revert . -R

para restablecer todo.

svn revert path/to/file

para un solo archivo

Abe Voelker
fuente
1
Eso no elimina archivos extra no versionados en la copia de trabajo, ¿verdad?
zoul
@zoul No lo creo, pero no me cites sobre eso ya que ha pasado un tiempo desde que usé SVN
Abe Voelker
desafortunadamente no toca los archivos no rastreados. intente svn revert -R your_local_svn_dir_path
Znik
7

Elimine archivos no versionados y revierte cualquier cambio:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

Fuera:

D         D:\tmp\sql\update\abc.txt
Denny Weinberg
fuente
1
esta es la mejor respuesta, sin secuencias de comandos adicionales. esto es universal y compatible con muchas versiones de svn.
Znik
3

Solución pura de Windows cmd / bat:

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
Andriy F.
fuente
2

Eliminar la copia de trabajo del sistema operativo y comprobarlo nuevamente es lo más simple, pero obviamente no es un solo comando.


fuente
Dolorosamente lento. Por eso estaba buscando una forma de evitar esto.
zoul
1
+1, esta es a menudo la única forma de solucionar problemas extraños, al menos que yo he encontrado.
Brad
2

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

usuario1299374
fuente
2
Esto es tan espantoso. ¿Qué pasa con los usuarios de Windows? Obviamente, Subversion necesita un poco de trabajo antes de que pueda tomarse en serio como herramienta de control de versiones.
Warren P
1

Para eliminar archivos sin seguimiento

Pude enumerar todos los archivos sin seguimiento informados por svn sten bash haciendo:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Si se siente afortunado, puede reemplazar echocon rmpara eliminar los archivos sin seguimiento. O copie los archivos que desea eliminar a mano, si se siente menos afortunado.


(Usé la respuesta de @ abe-voelker para revertir los archivos restantes: https://stackoverflow.com/a/6204601/1695680 )

ThorSummoner
fuente