Pregunta

Estoy trabajando en un proyecto con un amigo y quiero volver a una versión anterior de nuestro código y configurarlo para que sea la actual. ¿Cómo lo hago?

Estoy usando " anksvn " en vs08.

Tengo la versión que quiero en mi PC, pero la confirmación está fallando; El mensaje que recibo es "Error de confirmación, el archivo o directorio está desactualizado". "

También tengo el cliente de Subversion en mi PC.

¿Fue útil?

Solución

Básicamente necesitas " fusionar hacia atrás " - aplique una diferencia entre la versión actual y anterior a la versión actual (para que termine con una copia de trabajo que se parece a la versión anterior) y luego vuelva a confirmar. Por ejemplo, para pasar de la revisión 150 (actual) a la revisión 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

El Libro Rojo de Subversion tiene un buena sección sobre esto .

Otros consejos

Solo puede confirmar nuevos cambios en el encabezado del historial de subversion.

La razón por la que no puede hacer nada directamente con la buena copia que tiene en su PC, es que sus carpetas .svn saben que es un código del pasado, por lo que requiere una actualización antes de cualquier cometer.

Encuentre el buen número de revisión y revertir

  1. Encuentre el número de revisión de la copia antigua que desea. Obtenga su revisión actual con:

    svn info --show-item revision
    # or
    svn log
    

    O use:

    svn update -r <earlier_revision_number>
    

    para revisar varias versiones anteriores de su proyecto, hasta que encuentre el número de revisión correcto.

  2. Anote el buen número de revisión (suponiendo 123 para los ejemplos a continuación).

  3. Actualice a la última revisión:

    svn update
    
  4. Deshaga todos los cambios entre la revisión que desea y la última versión:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"
    

    (igual que la respuesta de Jon Skeet arriba)

Si no puede encontrar el número de revisión

Si no puede encontrar la copia antigua y solo desea confirmar los archivos que se encuentran actualmente en su PC:

  1. Haga una copia de su buena versión (pero sin ninguna carpeta .svn ):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. Ahora asegúrese de tener la última versión:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. Copie su buena versión sobre la copia de trabajo.

    Este comando copiará y también eliminará cualquier archivo del árbol de trabajo que no esté en su copia correcta, pero no afectará las carpetas existentes .svn .

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    Si no tiene rsync, puede usar cp -a pero también deberá eliminar los archivos no deseados manualmente.

  4. Debes poder cometer lo que tienes ahora.

    cd project
    svn commit "Reverted to good copy"
    

Solo usa esta línea

  

svn update -r yourOldRevesion

Puede conocer su revisión actual usando:

  

svn info

La forma estándar de usar la combinación para deshacer todo el check-in funciona muy bien, si eso es lo que quieres hacer. A veces, sin embargo, todo lo que desea hacer es revertir un solo archivo. No hay una forma legítima de hacerlo, pero hay un hack:

  1. Encuentre la versión que desea usar svn log.
  2. Use el subcomando de exportación de svn:

    svn exportar http: // url-to-your-file @ 123 / tmp / nombre de archivo

(Donde 123 es el número de revisión para una buena versión del archivo). Luego mueva o copie ese único archivo para sobrescribir el anterior. Comprueba el archivo modificado y listo.

Un poco más de la vieja escuela

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

entonces lo usual

svn diff
svn commit

Creo que esto es lo más adecuado:

Realice la fusión hacia atrás, por ejemplo, si el código confirmado contiene la revisión de rev 5612 a 5616, simplemente fusionar hacia atrás. Funciona en mi final.

Por ejemplo:

svn merge -r 5616:5612 https://<your_svn_repository>/

Contendría un código combinado de vuelta a la revisión anterior, luego podría cometerlo.

Esto es lo que hice y trabajé para mí.

Quiero deshacer los cambios en varias confirmaciones que hice en ciertos momentos y quiero ir al punto de confirmación anterior.

  1. Ir al equipo - > Mostrar historial.
  2. Haga clic con el botón derecho en el rango de revisiones que desee ignorar.
  3. Seleccione la opción " Revertir cambios " opción.

Esto ejecutará una combinación inversa, deshaciendo los cambios en su copia de trabajo.

Solo revisa el código y confirma.

Haga clic con el botón derecho en la jerarquía más alta que desee revertir > > Revertir o Volver a revisión

Haz clic derecho en el proyecto > Reemplazar con > Revisión o URL > Seleccione la revisión específica que desea revertir.

Ahora confirme la versión del código de actualización local en el repositorio. Esto revertirá el código base a la revisión específica.

La mayoría de las respuestas anteriores han estado utilizando una combinación inversa, y esa suele ser la respuesta correcta. Sin embargo, hay una situación (que me acaba de ocurrir) donde no lo es.

Cuando cambié un pequeño cambio, accidentalmente cambié un archivo con finales de línea Unix a finales de línea DOS y lo confirmé. Esto se puede deshacer fácilmente, ya sea cambiando los finales de línea y confirmando de nuevo, o mediante una combinación inversa, pero tiene el efecto de hacer que svn blame incluya mi edición como la fuente de cada línea del archivo. (Curiosamente, TortoiseSVN en Windows no se ve afectado por esto; solo la línea de comando svn blame .)

Si desea mantener el historial según lo informado por svn blame , creo que debe hacer lo siguiente:

  • Eliminar el archivo y confirmar.
  • En el repositorio, copie la copia correcta del archivo en la cabecera y confirme.
  • Restaura cualquier edición que quieras mantener.

La eliminación asusta un poco, pero recuerda que siempre tienes el archivo guardado en el repositorio, por lo que restaurarlo no es un gran problema. Aquí hay un código para ilustrar los pasos. Supongamos que xxx es el número de revisión de la última copia válida.

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Tenga en cuenta que para una copia en el repositorio, el destino debe ser un directorio, no un nombre de archivo.

Sincroniza con la versión anterior y confirma. Esto debería hacer el truco.

Aquí también una explicación de deshacer cambios.

La respuesta de Jon Skeet es prácticamente la solución en pocas palabras, sin embargo, si eres como yo, es posible que desees una explicación. El manual de Subversion llama a esto un

Fusión de selección de cereza

Desde las páginas del manual.

  
      
  1. Este formulario se denomina fusión 'cherry-pick':   '-r N: M' se refiere a la diferencia en la historia de la    rama fuente entre las revisiones N y M.

         

    Se puede usar un 'rango inverso' para deshacer los cambios. Por ejemplo, cuando    fuente y destino se refieren a la misma rama, una previamente confirmada    La revisión puede ser 'deshecha'. En un rango inverso , N es mayor que M en    '-r N: M', o la opción '-c' se usa con un número negativo: '-c -M'    es equivalente a '-r M:'. Deshacer cambios como este también es conocido.    como realizar una 'fusión inversa'.

  2.   

  
      
  • Si la fuente es un archivo, entonces las diferencias se aplican a ese   archivo (útil para la fusión inversa de cambios anteriores). De otra manera,   si la fuente es un directorio, el destino se establece de forma predeterminada en '.'.

         

    En el uso normal, la copia de trabajo debe estar actualizada, en una sola    revisión, sin modificaciones locales y sin subárboles cambiados.

  •   

Ejemplo:

svn merge -r 2983:289 path/to/file

Esto reemplazará la copia local [2983] (que, según la cita anterior, debe estar sincronizada con el servidor, su responsabilidad) con la revisión 289 del servidor. El cambio ocurre localmente, lo que significa que si tiene un proceso de pago limpio, los cambios se pueden inspeccionar antes de confirmarlos.

Hay muchas respuestas peligrosas en esta página. Tenga en cuenta que desde la versión 1.6 de SVN, hacer una actualización -r puede causar conflictos en los árboles, lo que se convierte rápidamente en una pesadilla kafkeresque potencialmente perdedora de datos en la que está buscando en Google información sobre los conflictos en los árboles.

La forma correcta de revertir a una versión es:

svn merge -r HEAD:12345 .

Donde 12345 es el número de versión. No olvides el punto.

Lo siguiente me ha funcionado.

Tuve muchos cambios locales y tuve que descartarlos en la copia local y sacar la última versión estable en SVN.

  1. Comprueba el estado de todos los archivos, incluidos los archivos ignorados.

  2. Coloca todas las líneas para obtener los archivos recién agregados e ignorados.

  3. Reemplaza aquellos con //.

  4. y rm -rf todas las líneas.

    svn status --no-ignore | grep '^ [? I]' | sed " s / ^ [? I] // " | xargs -I {} rm -rf " {} "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top