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".

Benedikt Waldvogel
fuente
¿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)

jkramer
fuente
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
Casebash
fuente
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.

Espiga
fuente
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.

Chris
fuente
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.

parvus
fuente
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!

Greg Hewgill
fuente
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.

Eón
fuente
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í

bahrep
fuente
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)

BCS
fuente
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.

Ian Dunn
fuente
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.
michaeljt
fuente