¿Cuál es la forma correcta de restaurar un archivo eliminado de SVN?

119

Eliminé un archivo de un repositorio y ahora quiero volver a colocarlo. Lo mejor que puedo averiguar es:

  • actualizar a la revisión antes de la eliminación
  • copiar los archivos en otro lugar
  • actualizar a la cabeza
  • copia los archivos de nuevo
  • Agregalos
  • cometer

Eso simplemente huele mal y, para empezar, pierde toda la historia. Tiene que haber una mejor manera de hacer esto. Ya busqué en The SVN Book pero no encontré nada y ahora estoy buscando en la lista de etiquetas SVN.

BCS
fuente
4
Seguramente la respuesta de tukushan es la respuesta directa correcta a su pregunta, ¿y debería aceptarse?
James McCormack
@JamesMcCormack: vea el NB en su respuesta.
BCS
2
Un consejo, si eliminó el archivo y aún no ha realizado el cambio, simplemente haga clic derecho y la actualización lo recuperará.
Hammad Khan

Respuestas:

57

Utilice svn merge:

svn merge -c -[rev num that deleted the file] http://<path to repository>

Entonces un ejemplo:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

Para TortoiseSVN (creo ...)

  • Haga clic derecho en el Explorador, vaya a TortoiseSVN -> Combinar ...
  • Asegúrate de que la opción "Combinar un rango de revisiones" esté seleccionada, haz clic en Siguiente.
  • En el cuadro de texto "Intervalo de revisión para fusionar", especifique la revisión que eliminó el archivo.
  • Marque la casilla de verificación "Fusión inversa", haga clic en Siguiente
  • Haga clic en Combinar

Sin embargo, eso está completamente sin probar.


Editado por OP : esto funciona en mi versión de TortoiseSVN (el tipo antiguo sin el botón siguiente)

  • Vaya a la carpeta de la que se retrasaron las cosas
  • Haga clic derecho en el Explorador, vaya a TortoiseSVN -> Combinar ...
  • en la sección De ingrese la revisión que hizo la eliminación
  • en la sección Para , ingrese la revisión antes de la eliminación.
  • Haga clic en "fusionar"
  • cometer

El truco consiste en fusionar al revés . ¡Felicitaciones a sean.bright por señalarme en la dirección correcta!


Editar: estamos usando diferentes versiones. El método que describí funcionó perfectamente con mi versión de TortoiseSVN.

También es de destacar que si hubo varios cambios en la confirmación, está fusionando en reversa, querrá revertir esos otros cambios una vez que la fusión se haya realizado antes de realizar la confirmación. Si no lo hace, esos cambios adicionales también se revertirán.

Sean Bright
fuente
Estoy en Windows y no tengo una versión CLI de SVN. ¿Sabías cómo hacer que ortoiseSVN hiciera eso?
BCS
Tortoise tiene "fusionar" en el menú contextual. Tiene casillas para rellenar para la rev. También "Dry Run" para ver si lo ha configurado correctamente. Y recuerde, el resultado no cuenta hasta que lo compromete. Puede revertir si todo se vuelve loco.
gbarry
Yo diría que el OP tiene una versión anterior de Tortoise. El más nuevo tiene un cuadro de diálogo de combinación diferente (inferior)
1800 INFORMACIÓN
Todavía tengo que ver CUALQUIER sistema de fusión que no apestara. Texto, archivos, directorios, documentos de Word, puaj. Creo que no es un problema solucionable. OTOH las cosas pueden apestar más o menos. :)
BCS
1
Si revierte varios archivos y luego revierte uno de los revertimientos, eso es irreversible. ¡Ay! Creo que acabo de lastimar algo.
BCS
176

El problema de hacer una fusión de svn como sugirió Sean Bright es que reintroduce otros cambios realizados en la misma revisión que la eliminación. Una copia svn es una operación más específica que solo afectará a los archivos eliminados.

Usando Tortoise SVN puede resucitar un archivo que ha sido eliminado de su directorio de copia de trabajo y de revisiones posteriores de SVN, a través de una copia svn de la siguiente manera:

  • Busque la carpeta de la copia de trabajo que anteriormente contenía el archivo.
  • Haga clic derecho en la carpeta en el Explorador, vaya a TortoiseSVN -> Mostrar registro.
  • Haga clic derecho en el número de revisión justo antes de la revisión que eliminó el archivo y seleccione "Examinar repositorio".
  • Haga clic derecho en el archivo eliminado y seleccione "Copiar a copia de trabajo ..." y guarde.

El archivo eliminado ahora estará en la carpeta de copia de trabajo. Para volver a agregarlo a SVN, haga clic derecho en el archivo restaurado y seleccione SVN Commit.

NB: Este método conservará el historial anterior del archivo restaurado; sin embargo, para ver el historial anterior en el registro de TortoiseSVN, debe asegurarse de que "Detener al copiar / renombrar" no esté marcado en el cuadro de diálogo Mensajes de registro.

tekumara
fuente
26
Esto también se puede realizar directamente en el servidor, útil si los archivos o carpetas eliminados eran bastante grandes: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig
Esta es la forma correcta de hacerlo. Intenté con TortoiseSVN 1.8.1 y funciona según lo recomendado.
Dr. Gianluigi Zane Zanettini
¡¡Perfecto!! Simple y eficaz. Gracias por la solución
Hunter
Este método me facilitó mucho la restauración de un archivo en una rama secundaria que se había eliminado de su rama principal. Quizás había una manera de hacer eso merge, pero no lo descubrí.
arr_sea
"Justo antes" en el paso 3 es importante. En el paso 4, Tortoise siguió quejándose de que el archivo ya existe, a pesar de que lo había eliminado usando una eliminación de Windows. Primero tuve que actualizar mi copia de trabajo. (Mi colega había eliminado varios archivos usando la función Tortoise delete y luego confirmó los cambios). TortoiseSVN 1.8.1.
leqid
16

Utilice la función de copia de Tortoise SVN para revertir los cambios confirmados:

  1. Haga clic derecho en la carpeta principal que contiene los archivos / carpeta eliminados
  2. Seleccione el "show log"
  3. Seleccione y haga clic derecho en la versión antes de la cual se realizaron los cambios / eliminados
  4. Seleccione el "repositorio de exploración"
  5. Seleccione el archivo / carpeta que necesita ser restaurado y haga clic derecho
  6. Seleccione "copiar a" que copiará los archivos / carpetas a la revisión principal

Espero que ayude

Mukul Joshi
fuente
13

Parece que siempre uso svn copy como una operación de servidor, así que no estoy seguro de si funciona con dos rutas de trabajo.

A continuación se muestra un ejemplo de cómo restaurar un archivo eliminado en una copia de trabajo local del proyecto:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Mientras está dentro del directorio del proyecto. Esto también funciona para restaurar directorios completos.

NullPoiиteя
fuente
2
+1 La copia @ funcionó. El copy -r no parece funcionar para usar CollabNet svn 1.6.17 en Mac OSX.
Grey
2
Además, la revisión utilizada debe ser la revisión justo antes de la eliminación.
Gray
6

Si está utilizando Tortoise SVN, debería poder revertir los cambios de esa revisión a su copia de trabajo (realizando efectivamente una fusión inversa), luego haga otra confirmación para volver a agregar el archivo. Los pasos a seguir son:

  1. Busque la carpeta en la copia de trabajo donde eliminó el archivo.
  2. Vaya al navegador de repositorios.
  3. Busque la revisión donde eliminó el archivo.
  4. En la lista de cambios, busque el archivo que eliminó.
  5. Haga clic derecho en el archivo y vaya a "Deshacer los cambios de esta revisión".
  6. Esto restaurará el archivo a su copia de trabajo, manteniendo el historial.
  7. Confirme el archivo para volver a agregarlo a su repositorio.
davogones
fuente
Bien, en ese caso, la pregunta era cómo hacer lo que acaba de describir. (Respuesta: use fusionar al revés)
BCS
1
Estaba hablando de cómo hacerlo en Tortoise SVN. Agregaré más detalles.
davogones
5

La forma más fácil en la que he podido restaurar archivos y no perder el historial de revisión es usando la copia SVN , el ejemplo de fusión anterior me parece una forma más compleja de lograr lo mismo. ¿Por qué es necesario fusionar cuando simplemente desea restaurar una revisión?

Utilizo lo siguiente en este caso y funciona bastante bien.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Parece que siempre lo uso svn copycomo una operación de servidor, por lo que no estoy seguro de si funciona con dos rutas de trabajo.

Daniel Honig
fuente
3
SVN COPY es el enfoque recomendado. La sintaxis es muy simple: svn copy [URL SVN] @ [REVISION # DONDE EXISTE EL ARCHIVO] [RUTA LOCAL PARA RESTAURAR] de visualsvn.com/support/svnbook/branchmerge/basicmerging . Solo usé esto yo mismo.
amit
Esto tiene más sentido para mí, también uso este enfoque
Dmitry Pashkevich
4

Con Tortuga SVN :

Si aún no ha confirmado sus cambios, puede revertir la carpeta principal donde eliminó el archivo o directorio.

Si ya ha confirmado el archivo eliminado, puede usar el navegador del repositorio, cambiar a la revisión donde aún existía el archivo y luego usar el comando Copiar a ... en el menú contextual. Ingrese la ruta a su copia de trabajo como destino y el archivo eliminado se copiará del repositorio a su copia de trabajo.

VonC
fuente
bonito. Lo intentaré la próxima vez.
BCS
1

Debería poder ver el único archivo que desea restaurar. Pruebe algo como svn co svn://your_repos/path/to/file/you/want/to/restore@revdónde revestá la última revisión en la que existía el archivo.

Tuve que hacer exactamente esto hace un tiempo y, si no recuerdo mal, usar la -ropción svnno funcionó; Tuve que usar la :revsintaxis. (Aunque podría haberlo recordado al revés ...)

David Z
fuente
Eso no es lo que quiero. Quiero volver a parchear el archivo en el repositorio y que SVN sepa que es el mismo archivo.
BCS