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
Sever Gökhan
fuente
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? ".

Eric Hauser
fuente
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

Nunca dormir otra vez
fuente
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.

la estrella
fuente
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.

Mitch Dempsey
fuente
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?

Michel Müller
fuente
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.

khmarbaise
fuente
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

Jennifer Elyse
fuente
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.

Joseph Coco
fuente
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
Kalpesh Soni
fuente
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.
Elling
fuente
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.

Kristina
fuente
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).

Robert Leland
fuente
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

Olmstov
fuente
-1
sudo svn revert filename

esta es la mejor manera de revertir un solo archivo

mallikarjun SK
fuente
2
Realmente espero que nunca te acerques a una máquina de producción con permisos sudoer.
David Lakatos