Compromisos parciales con Subversion


104

Dado el caso, hice dos cambios independientes en un archivo: por ejemplo. agregó un nuevo método y cambió otro método.

A menudo no quiero realizar ambos cambios como una confirmación, sino como dos confirmaciones independientes.

En un repositorio de git, usaría el modo interactivo de git-add (1) para dividir el trozo en otros más pequeños:

 git add --patch

¿Cuál es la forma más sencilla de hacer esto con Subversion? (Quizás incluso usando un complemento de Eclipse)

Actualización:
En The Thing About Git , Ryan lo llama: "El problema de la copia de trabajo enredada".


¿Buscaba específicamente una solución en la línea de comandos? Muchas de las respuestas a continuación mencionan TortoiseSVN 'restaurar después de confirmar', que es una característica exclusiva de Tortoise, por lo que está basada en GUI y Windows.
florisla

Respuestas:


35

Con git-svn puede crear un repositorio GIT local del repositorio SVN remoto, trabajar con él utilizando el conjunto completo de características de GIT (incluidas las confirmaciones parciales) y luego enviarlo todo de regreso al repositorio SVN.

git-svn (1)


25
Hay una ironía particular en esta solución.
tuxayo

65

Tortoise SVN 1.8 ahora admite esto con su función "Restaurar después de confirmar". Esto le permite realizar ediciones en un archivo, y todas las ediciones se deshacen después de la confirmación

Según la documentación:

Para confirmar solo las partes del archivo que se relacionan con un problema específico:

  1. en el cuadro de diálogo de confirmación, haga clic con el botón derecho en el archivo, elija "restaurar después de la confirmación"
  2. edite el archivo en, por ejemplo, TortoiseMerge: deshaga los cambios que no desea confirmar todavía
  3. guarda el archivo
  4. confirmar el archivo

Me pregunto cómo funciona esto. Revisé las notas de la versión de SVN 1.8 , pero no puedo averiguar en qué función se basa "Restaurar después de confirmar".
DavidS

3
@DavidS Esta no es una característica de SVN. Es una característica de TortoiseSVN.
florisla

FYI, SVN 1.8 es EOL desde abril de 2018 con el lanzamiento de 1.10
Greg K

También podemos encontrarlo en la documentación aquí: tortoisesvn.net/docs/release/TortoiseSVN_en/…
Guillaume Husta

42

He hecho esto usando TortoiseSVN .

La utilidad de combinación incorporada le permite mostrar una diferencia entre la versión del repositorio y su copia de trabajo.

Utilice la función de creación de copia de seguridad de la utilidad diff

  1. Vaya a confirmar su archivo como si fuera a confirmar todos sus cambios.
  2. En la ventana de confirmación, haga doble clic en el archivo para mostrar una diferencia.
  3. En la configuración de diferencias, haga clic en la opción para hacer una copia de seguridad del archivo original .
  4. Haga clic con el botón derecho en los cambios que no desea y use seleccionar usar otro bloque de texto .
  5. Guarde la diferencia exactamente una vez . La copia de seguridad se sobrescribirá cada vez que guarde. Es por eso que solo desea guardar una vez.
  6. Confirma el cambio.
  7. Sobrescriba el original con el archivo .bak creado (que tendrá todos sus cambios originales).
  8. Confirme su archivo.

Ahora debería tener todos sus cambios confirmados, usando dos confirmaciones separadas.


1
¿Cómo exactamente hiciste esto? Me interesaría aprender esa técnica.
Lasse V. Karlsen

Sería genial si esto se sobrescribiera automáticamente con los archivos .bak después de una confirmación.
BCS

No encontré el paso 3: Opción de copia de seguridad, usando Tortoise SVN 1.8.1
sudhAnsu63

4
No importa. Se encontró el enlace correspondiente para 1.8 tortoisesvn.net/tsvn_1.8_releasenotes.html Para confirmar solo las partes del archivo que se relacionan con un problema específico: en el cuadro de diálogo de confirmación, haga clic con el botón derecho en el archivo, elija "restaurar después de confirmar" editar el archivo en, por ejemplo, TortoiseMerge: deshaga los cambios que no desea confirmar pero guarde el archivo
confirme

Lamentablemente, esto no parece estar disponible en la versión 1.8.5 de Tortoise, ni es "restaurar después de confirmar".
kajaco

24

Intente usar y svn diff > out.patchluego copie el out.patcharchivo out.patch.addyout.patch.modify

Solo cuando tenga un archivo de parche que funcione, revierta el archivo original usando svn revert out.c.

Edite los archivos de parche a mano para que solo contengan los trozos para agregar o modificar. Aplíquelos al archivo original usando el patchcomando, pruebe si la adición funcionó, luego svn commitla adición.

Repita el enjuague para el out.patch.modifyparche.

Si los cambios están separados en el archivo como se indicó en su pregunta inicial, agregó un nuevo método, cambió un método existente, esto funcionará

Esta es una solución muy tediosa, aunque no estoy convencido de que deba tener alguna razón para separar sus confirmaciones.

También podría haber verificado varias copias de trabajo de la misma fuente para aplicar su trabajo contra:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Asegúrese de hacer una svn upprueba para asegurarse de que todo esté bien.


11

Esto es posible usando TortoiseSvn (Windows) desde v1.8.

4.4.1. El diálogo de confirmación

Si su copia de trabajo está actualizada y no hay conflictos, está listo para confirmar sus cambios. Seleccione cualquier archivo y / o carpeta que desee confirmar, luego TortoiseSVN → Confirmar ....

<snip>

4.4.3. Confirmar solo partes de archivos

A veces, solo desea confirmar partes de los cambios que realizó en un archivo. Esta situación suele ocurrir cuando está trabajando en algo, pero luego se debe confirmar una solución urgente, y esa solución se encuentra en el mismo archivo en el que está trabajando.

haga clic derecho en el archivo y use Menú contextual → Restaurar después de confirmar. Esto creará una copia del archivo tal como está. Luego puede editar el archivo, por ejemplo, en TortoiseMerge y deshacer todos los cambios que no desea confirmar. Después de guardar esos cambios, puede confirmar el archivo.

Una vez realizada la confirmación, la copia del archivo se restaura automáticamente y tiene el archivo con todas las modificaciones que no se confirmaron.

En Linux, le daría a http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php una oportunidad. Sin embargo, no lo he probado yo mismo.


8

Solía ​​hacer esto:

  • En mi editor (uso vim), edito el archivo para que solo aparezca uno de los cambios
  • Guarde el archivo (pero no salga del editor)
  • Confirme el archivo modificado en svn
  • Presiona "deshacer" en el editor suficientes veces para que vuelva a aparecer el segundo conjunto de cambios.
  • Guarde el archivo nuevamente
  • Confirme el segundo conjunto de cambios.

Este es un enfoque simplista que asume que un conjunto de cambios es razonablemente fácil de deshacer. Para situaciones más complejas, me rendiría y realizaría ambos cambios sin preocuparme por eso.

Ahora que uso git, ¡esto es algo que espero no tener que volver a hacer nunca más!


4

Utilizo un repositorio de darcs local o simplemente fusiono los cambios gradualmente. Con la fusión (opendiff abre FileMerge, un programa de fusión que viene con Xcode; reemplácelo con su herramienta de fusión favorita):

cp file file.new
svn revert file
opendiff file.new file -merge file

fusionar los cambios relacionados, guardar la fusión, salir del programa de fusión

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

si hay más de un trozo no relacionado en el archivo, enjuague y repita (pero ¿por qué esperaría tanto antes de comprometerse?)

Además, si conoce git, puede usar git-svn para mantener un repositorio local de git y sincronizar sus confirmaciones con un servidor maestro svn; funciona muy bien en mi limitada experiencia.


9
Re: "¿Por qué esperar tanto?" Estás haciendo una gran refactorización durante todo el día y el jefe deja caer un pequeño error de "arregla esto ahora" justo antes del almuerzo.
BCS

4

Pruebe VisualSVN para Visual Studio . La última versión 6.1 presenta la función QuickCommit. Puede confirmar parcialmente los cambios seleccionados en un archivo utilizando los nuevos comandos del menú contextual Confirmar este bloque y Confirmar selección en el editor de Visual Studio.

ingrese la descripción de la imagen aquí


2
  1. Abra todos los archivos que desea dividir en el editor de su elección
  2. Usando un conjunto de herramientas diferente (en Win, use la sugerencia de Spike (la versión anterior)), retire el segundo conjunto
  3. Cometer
  4. regrese a su editor de elección y guarde todos los archivos

Es un poco más arriesgado que la sugerencia completa de Spike, pero puede ser más fácil de hacer. También asegúrese de probarlo en otra cosa primero, ya que algunos editores se negarán a guardar un archivo que haya cambiado de debajo de ellos a menos que vuelva a cargar ese archivo (perdiendo todos sus cambios)


0

Creo que una opción más fácil que generar archivos diff, revertir, etc., sería tener dos copias del repositorio retiradas y usar una herramienta de diferencia visual como DeltaWalker para copiar trozos de uno a otro.

La primera copia sería aquella con la que realmente trabaja, y la segunda sería solo para este propósito. Una vez que haya realizado muchos cambios en la primera, puede copiar una sección a la segunda, confirmarla, copiar otra sección, confirmarla, etc.


0
  1. Copie todos los archivos modificados correspondientes a copias de seguridad.
  2. Cree un parche del estado de trabajo usando svn diff.
  3. Revertir los archivos usando svn revert.
  4. Vuelva a aplicar las partes del parche que desea confirmar, ya sea usando la patchherramienta, editando manualmente o lo que sea.
  5. Ejecute diffluego para comparar su copia de trabajo con su copia de seguridad para asegurarse de que aplicó las partes del parche correctamente.
  6. Construya y pruebe.
  7. Cometer.
  8. Copie sus copias de seguridad en la caja de su repositorio.
  9. Repita en 2. (¡no en 1.!) Hasta que esté listo.
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.