¿Cómo descartar cambios locales en un proceso de pago SVN?

197

Quería enviar un diff para su revisión, para un proyecto de código abierto.

Obtuve el código usando SVN (del terminal, Ubuntu). E hice ediciones menores en pocos archivos. Ahora solo quiero enviar un cambio. El resto de los cambios que hice fueron para depurar y ya no son necesarios.

He generado diff usando svn di > ~/os/firstdiff.diff

Entonces mi pregunta, ¿Cómo descartar mis cambios locales?

¿Hay una forma SVN de hacerlo? Si no, tendré que ir a cada archivo y eliminar todas mis ediciones. Luego generaría un nuevo diff y lo enviaría.

Vinayak Garg
fuente

Respuestas:

253

Simplemente use el svn revertcomando, por ejemplo:

svn revert some_file.php

Está (como cualquier otro comando svn) bien documentado en el recurso svnbook o en la página man, o incluso con el svn helpcomando.

Cédric Julien
fuente
2
Excepto que Vinayak podría querer mantener sus cambios locales sin interés para él.
Basile Starynkevitch
2
@BasileStarynkevitch: He leído la pregunta nuevamente, y parece que los otros cambios no son necesarios: "" "El resto de los cambios que hice, fueron básicamente para la depuración y ya no son necesarios." "" :)
Cédric Julien
1
Sí ... pero podría querer conservarlos más para él ... (Su pregunta podría entenderse en ambos sentidos).
Basile Starynkevitch
193

Debe revertir todos los cambios con el comando svn revert :

  • Revertir cambios a un archivo: svn revert foo.c
  • Revertir un directorio completo de archivos: svn revert --recursive .
Alberto Spelta
fuente
1
la referencia a svn 1.1 es un poco antigua, a pesar del hecho de que es el primer enlace proporcionado por google ;)
Cédric Julien
aparentemente algunos caracteres en su nombre de archivo pueden ser ignorados. por ejemplo [email protected]. svn revert [email protected]. svn dice 'Icono' omitido.
topwik
1
Esta es la mejor respuesta. Debe ser revisado.
rickfoosusa
12
El svn revert --recursive .me ayuda mucho .
Paul Vargas
Esta debería ser la respuesta aceptada, ya que el --recursiveparámetro revierte cualquier cambio local y esta es la pregunta.
arueckauer
15

Para descartar cambios locales en un archivo en particular:

$ svn revert example_directory/example_file.txt

Para descartar cambios locales en una carpeta en particular:

$ svn revert -R example_directory/
batigolix
fuente
7

Simple svn revertfue suficiente para el póster original. Sin embargo, un simple svn revertno servirá en el caso más general donde

  1. tiene las ediciones que desea compartir y las ediciones que no desea compartir en el mismo archivo ,
  2. tenga cambios locales que aún le interese conservar para su propio beneficio privado .

La sugerencia de @ ErichBSchulz de usar git add -pes muy razonable y mucho más generalmente aplicable en tal caso. La respuesta simplemente carecía de algunos detalles. Suponiendo que su directorio actual es el directorio que desea hacer el parche que se puede compartir, podría hacer algo como esto:

  1. Verifique la versión original de Subversion a un directorio diferente (elija un nombre de directorio que no exista, aquí usando el subdirectorio TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Usando ese pago prístino de svn como base, inicie un repositorio git, ignorando los directorios .svn; compromete todo en svn head a su repositorio temporal de git

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Copie los metadatos del repositorio git recién preparado en su directorio de trabajo original; como no se necesita el directorio prístino de subversión, puede deshacerse de él. Su directorio de trabajo ahora es el repositorio git y subversion:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Ahora puede usar de manera poderosa y conveniente git add -ppara elegir interactivamente exactamente lo que desea compartir y enviarlos a su repositorio git. Si necesita agregar archivos a la confirmación, hágalo también git add <file-to-add>antesgit commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. Usando el commit, prepare un parche que quiera compartir. Para este propósito, también puede usar git diff HEAD^..HEAD, o git format-patch(este último se puede usar para preparar directamente los correos electrónicos que se enviarán con el parche o parches múltiples):

    $ git show -p HEAD > my-mighty-patch.patch
    

Para deshacerse de los metadatos de git, solo hazlo rm -rf .git/. Si planea continuar hackeando con el directorio de trabajo original, puede continuar usándolo gitpara administrar sus cambios locales. En este caso, probablemente se beneficiaría de la inversión de aprender a usar git svn.

Nota: Si está familiarizado con gitesto, es algo trivial improvisar. De lo contrario, esto puede parecer un poco desordenado. Puede generalizar el enfoque escribiendo una secuencia de comandos a partir de estos pasos para implementar una "confirmación interactiva" o una "creación interactiva de parches" para svn que podría usarse sin comprender Git.

FooF
fuente
3
Muchas gracias por -1 anónimo sin ninguna explicación. De cualquier manera, me tomé el tiempo para mejorar la respuesta aclarando cuándo este enfoque tiene sentido.
FooF
2
Muchas gracias por expandirse. ¡+1 de mi parte! No te preocupes Muchedumbre dura.
ErichBSchulz
1
Gracias por el visto bueno, @ErichBSchulz! ¡Poco a poco estamos haciendo del mundo un lugar mejor para vivir a pesar de los adversarios! ;-)
FooF
4

Podrías usar

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

Al publicar su diferencia, no olvide decir la revisión contra la cual difiere.

Como otros respondieron, también puedes usarlo con svn revertcuidado. Depende de si desea mantener sus cambios locales para su trabajo futuro o no ...

Basile Starynkevitch
fuente
+1 Esta es la mejor solución al problema, pero en este caso realmente quería deshacerme de todos mis cambios. Por supuesto, no quisiera revertmis cambios todo el tiempo. Entonces usaría tu camino en el futuro.
Vinayak Garg
3

Vaya a la raíz de ese repositorio y ejecute el siguiente comando

svn revert --depth=infinity .
Bunty
fuente
1
svn revert -R .podría ser más corto
jesjimher
1

Puede usar el comando commit en el archivo que desea poner y usar el comando svn revert para descartar los cambios locales restantes

jlemos
fuente