Revertir un solo archivo en SVN a una revisión particular


182

Tengo un archivo como se muestra a continuación en un repositorio SVN que me gustaría volver a una versión anterior. ¿Cuál es la forma de hacer esto en SVN? Solo quiero degradar este archivo en particular a una versión anterior, no todo el repositorio.

Gracias.

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial

cuando dijiste revertir, qué
querías

Respuestas:


181

Si solo desea el archivo antiguo en su copia de trabajo:

svn up -r 147 myfile.py

Si desea revertir, consulte " ¿Cómo volver a una versión anterior de nuestro código en subversion? ".


8
pero la próxima vez que actualice
recibirá

2
si no quiere recuperarlo, svn confirme ese archivo, para poner la versión que desea en el repositorio
Packet Tracer

14
Esto probablemente no hace realmente lo que quería el que preguntaba. Con esto, la copia de trabajo está limpia y no se puede confirmar TAL CUAL, y una "actualización svn" sin un número de versión especificado recuperará la última versión no deseada.
CXJ

1
¿Cómo puedo confirmar el archivo revertido entonces?
marcio

2
Esto no está del todo bien porque, como CXJ menciona, no hay una manera de confirmar el archivo actualizado. Probablemente quiera hacer lo que dice Mitch Dempsey (tenga en cuenta, sin embargo, --force para forzar la sobrescritura del archivo): svn export --force -r 147 myfile.py myfile.py
avejidah

76

¡svn cat también tiene una revisión arg!

svn cat -r 175 mydir/myfile > mydir/myfile


20
Esta es, de lejos, la mejor respuesta en la página. Deja el archivo modificado en un estado que puede confirmarse.
dotancohen

Esto no parece funcionar cuando está pegando en un nuevo archivo
ahnbizcad

jaja mirándolo, idk en qué contexto estaba pensando cuando publiqué. No puedo recordar Parece sin sentido.
ahnbizcad

Esto es simple y directo para cuando simplemente desea deshacer sus cambios y recuperar un archivo en su estado previo a la confirmación sin ningún tecnicismo de control de versiones.
Anónimo el

57
svn revert filename 

Esto debería revertir un solo archivo.


44
¿Qué pasa con todas las otras respuestas con comandos más largos? Gracias.
masterxilo

De nada. No tengo idea de qué pasa con otras respuestas ... jajaja
thestar

13
Esto revierte a qué revisión? Doc dice que simplemente reemplaza con lo último en repositorio. La pregunta es cómo volver a una versión anterior.
tgkprog

1
Esto vuelve a la última versión de repo. Si lees la descripción de las preguntas, parece que estaba buscando cómo revertir un solo archivo, no todo el directorio.
thestar

55
Creo que todo esto hace es destruir su copia de trabajo 'revertiéndola' de nuevo a la cabeza. O a lo que alguna vez fue desprotegido. confirme haciendo svn update -r VER archivo, luego haga un svn revert.
Gerard ONeill

50

Para un solo archivo, podría hacer:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Podría hacerlo, svn revert <file>pero eso solo restaurará la última copia de trabajo.


2
exportar, luego pegarlo en su copia local, ¿luego confirmarlo nuevamente?
tgkprog

1
@tgkprog esa es una forma de hacerlo, sí
Mitch Dempsey

@tgkprog y ¿cuál es la forma "preferida"?
hbogert

No tengo idea, pero eso es lo que funcionó para mí: exporté la revisión anterior. Abierto en el bloc de notas, copiado, pegado en el archivo de trabajo. Se comprometió a encabezar con comentarios sobre qué revolución y por qué. Las herramientas de UI podrían tener una mejor manera.
tgkprog

21

Hasta ahora, todas las respuestas aquí parecen tener desventajas significativas, son complicadas (necesitan encontrar el URI del repositorio) o no hacen lo que la pregunta probablemente preguntó: Cómo volver a poner el Repo en un estado de funcionamiento con esa versión anterior del archivo .

svn merge -r head:[revision-number-to-revert-to] [file-path]OMI es la forma más limpia y sencilla de hacer esto. Tenga en cuenta que traer de vuelta un eliminado archivo no parece funcionar de esta manera [1]. Consulte también la siguiente pregunta: ¿ Mejor manera de volver a una revisión SVN anterior de un archivo?

[1] Para lo que desea svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up, consulte también ¿Cuál es la forma correcta de restaurar un archivo eliminado de SVN?


Deseo comentar que, al menos para mi versión de Subversion, svn mergeno toma varios archivos como argumento por alguna razón. En este caso, parece no hacer nada (sin un mensaje de error).
Wrzlprmft

Pero mi comando aún funciona repitiéndolo para cada archivo, ¿verdad?
Michel Müller el

Sí, de hecho lo hace.
Wrzlprmft

1
De acuerdo en que este es el más limpio.
KevinG

13

La mejor manera es:

svn merge -c -RevisionToUndo ^/trunk

Esto deshacerá todos los archivos de la revisión que simplemente revierte aquellos archivos que no desea deshacer. No olvide el guión ( -) como prefijo para la revisión.

svn revert File1 File2

Ahora confirme los cambios.


9

Quieres hacer

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

Una vez que haga eso, tendrá esa revisión del archivo en un estado comprometible. Confirmar el archivo


7

Descubrí que es simple hacer esto a través del svn catcomando para que ni siquiera tenga que especificar una revisión.

svn cat mydir/myfile > mydir/myfile

Esto probablemente no hará retroceder los datos de inodo (metadatos) como las marcas de tiempo.


luego confirme el archivo para que vaya al repositorio
tgkprog

3
Esto funcionó para mí mejor que la actualización. Porque la actualización no le permite confirmar la modificación realizada en ese archivo. (svn 1.8.3)
fe_lix_

7

sorprendido de que nadie mencionó esto

sin averiguar el número de revisión, podría escribir esto, si acaba de confirmar algo que desea revertir, esto no funcionará si cambió algún otro archivo y el archivo de destino no es el último archivo cambiado

svn merge -r HEAD:PREV file

si tiene comentarios por favor discuta aquí antes de hacer ediciones?
Kalpesh Soni

1
¿El escenario en la pregunta no requiere una fusión inversa del cambio más reciente, de modo que debamos aplicar los cambios necesarios para pasar de HEAD a PREV?
Nick Russo el

44
El comando debería ser svn merge -r HEAD:PREV filecomo @Nick Russo dijo
Heinz

4

Si solo se trata de un par de archivos, y si está utilizando Tortoise SVN, puede utilizar el siguiente enfoque:

  1. Haga clic derecho en su archivo fuente y seleccione "TortoiseSVN" -> "Mostrar registro".
  2. Haga clic derecho en una revisión en el registro y seleccione "Guardar revisión en ...".
  3. Deje que la revisión anterior sobrescriba su archivo actual.
  4. Confirme el archivo fuente sobrescrito.

Esto guarda un nuevo archivo no versionado como file-xxxx en el que xxxx es el número de revisión anterior. ¿Qué hacemos a continuación? eliminar la nueva revisión (HEAD, por ejemplo), cambiar el nombre del nuevo archivo, agregar, confirmar?
Heinz

No, no lo guarde con el número de revisión en el nombre del archivo. Guárdelo con exactamente el mismo nombre de archivo que la versión actual del mismo archivo (en otras palabras, no xxxx en el nombre del archivo). Entonces solo haz un commit ordinario después de eso.
Elling

4

Solo agrego a la respuesta de @Mitch Dempsy ya que aún no tengo suficiente representante para comentar.

svn export -r <REV> svn://host/path/to/file/on/repos --force

Al agregar --force se sobrescribirá la copia local con la exportación y luego puede hacer una confirmación svn para enviarla al repositorio.


y esta es la mejor respuesta :)
Zgr3doo

¿Por qué es esta la mejor respuesta? no gestiona la historia de la "manera svn"
Jason S

2

Una opción alternativa para un solo archivo es "reemplazar" la versión actual del archivo con la revisión anterior:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Esto tiene la característica adicional de que los cambios no deseados no se muestran en el registro de este archivo (es decir, svn log file.ext).


1

Si desea revertir un archivo individual de una revisión específica y poder confirmar, entonces:

svn merge -c - [OldRev #] [Nombre de archivo]

es decir. svn merge -c -150 myfile.py

Tenga en cuenta lo negativo en el número de revisión


-1
sudo svn revert filename

esta es la mejor manera de revertir un solo archivo


2
Realmente espero que nunca te acerques a una máquina de producción con permisos sudoer.
David Lakatos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.