SVN deshacer eliminar antes de confirmar

135

Si elimina un directorio de una copia de trabajo SVN, pero aún no se ha comprometido, no es obvio cómo recuperarlo. Google incluso sugiere "svn undo delete before commit" como una consulta común cuando escribe "svn undo d", pero los resultados de búsqueda no son útiles.

editar: me gustaría una solución que funcione en subversion 1.4.4

Laca
fuente
¿Hay algún directorio relacionado con el que eliminó con cambios pendientes? Si es así, tenga cuidado al revertir desde un nivel superior, puede perder cambios.
Russell el

Respuestas:

145

svn revert deletedDirectory

Aquí está la documentación para el svn revertcomando.


EDITAR

Si deletedDirectoryse eliminó usando rmdiry no svn rm, deberá hacer

svn update deletedDirectory

en lugar.

Michael Hackner
fuente
3
Eso debe ser nuevo, no funciona en SVN 1.4.4. (Fue lo primero que intenté)
LaC
44
Esto es lo que dice 1.4.4, por cierto: $ svn ayuda revert revert: Restaurar el archivo de copia de trabajo prístino (deshacer la mayoría de las ediciones locales). uso: revert PATH ... Nota: este subcomando no requiere acceso a la red y resuelve cualquier estado en conflicto. Sin embargo, no restaura los directorios eliminados.
LaC
1
1.6.6 tiene el mismo texto en la ayuda, pero funcionó para mí cuando lo probé. Tenga en cuenta que si no lo utilizó svn deletepara eliminar el directorio, sino que lo eliminó utilizando rmdir, deberá svn update deletedDirectoryhacerlo en su lugar.
Michael Hackner el
He eliminado un archivo (svn del) de un directorio local de svn-ed. svn update no funcionó pero svn revert funcionó. Estaba usando SynchroSVN para Mac. Sin embargo, gracias por los consejos.
karim
55
Según el enlace, use svn -R revert para recuperar todo el directorio con todo el contenido, que es probablemente lo que desea. svn revert sin -R simplemente restaura el directorio, no el contenido.
n13
156

1) hacer

svn revert . --recursive

2) analizar la salida para errores como

"Failed to revert 'dir1/dir2' -- try updating instead."

3) llame a svn para cada uno de los directorios de error:

svn up dir1/dir2
Denis Barmenkov
fuente
12
Esta es la respuesta más precisa, muchas gracias, me ayudaste mucho.
greenoldman
1
¿Excepto que revierte todo? Es posible que no quieras hacer eso.
n13
1
Esto tiene más sentido si tiene una carpeta completa que SVN cree que se eliminó. Tuve eso mientras revisaba una copia de trabajo. Ya existía una carpeta, por lo que se colocó en conflicto y no se desprotegió. Era un enlace a otra carpeta. Lo renombré e intenté svn upque lo revisara, me di cuenta del conflicto, lo hice svn resolved fooy svn statusme dijo que tenía unos 10k archivos marcados como D. svn upy svn revertno los recuperé, pero esto resolvió el problema.
simbabque
66
+1 para lo --recursiveque ayuda a restaurar el contenido de los directorios eliminados.
Melebius
1
¡Dios mío, me salvaste la noche!
ArturOlszak
32

Lo que funcionó para mí es

svn revert --depth infinity deletedDir
Jason
fuente
Esto funcionó muy bien para mí (svn 1.7.10) donde svn revert deletedDir no pudo hacer el trabajo. Excelente respuesta
rtome
4

Realice una operación de reversión (recursiva) desde un nivel superior al directorio que eliminó.

Greg Hewgill
fuente
1
Esto borrará MUCHO más cambios de los necesarios.
Michael Hackner el
Eso no funciona con Subversion 1.4.4 (lo acabo de probar). svn help revert incluso dice "este subcomando no requiere acceso a la red y resuelve cualquier estado en conflicto. Sin embargo, no restaura los directorios eliminados". Lo siento, debería haber especificado la versión. 1.4.4 es lo que viene con Mac OS X 10.5.
LaC
4

Para convertirlo en un trazador de líneas, puede probar algo como:

svn status | cut -d ' ' -f 8 | xargs svn revert
Earle
fuente
Puedo crear un directorio con espacios en su nombre. Puede romperse 'cortar' AFAIK.
Denis Barmenkov
1

La solución más simple que pude encontrar fue eliminar el directorio padre de la copia de trabajo (con rm -rf, no svn delete), y luego ejecutar svn update en el abuelo. Por ejemplo, si eliminó a / b / c, rm -rf a / b, cd a, svn up. Eso lo devuelve todo. Por supuesto, esta es solo una buena solución si no tiene otros cambios no confirmados en el directorio principal que desea conservar.

Espero que esta página esté en la parte superior de los resultados la próxima vez que busque en Google esta pregunta. Sería aún mejor si alguien sugiriera un método más limpio, por supuesto.

Laca
fuente
Eso supone que no hay subdirectorios en el padre que tengan cambios pendientes.
Russell el
0

Puede eliminar la carpeta y actualizar el directorio principal antes de confirmar:

rm -r some_dir

svn update some_dir_parent

xinthose
fuente