Compromisos parciales con Subversion

Dado el caso hice dos cambios independientes en un file: ej. agregó un nuevo método y cambió otro método.

A menudo no quiero comprometer ambos cambios como uno commit, sino como dos commits independientes.

En un repository git usaría el modo interactivo de git-add (1) para dividir el trozo en pequeños:

git add --patch 

¿Cuál es la forma más fácil de hacer esto con Subversion? (Tal vez incluso usando un complemento de Eclipse)

Actualizar:
En The Thing About Git , Ryan lo llama: "El problema de la copy de trabajo ennetworkingada".

Con git-svn puede hacer un repository GIT local del repository SVN remoto, trabajar con él usando el set completo de características GIT (incluidas las confirmaciones parciales) y luego llevarlo de vuelta al repository SVN.

git-svn (1)

Tortoise SVN 1.8 ahora admite esto con su function "Restaurar después de confirmar". Esto le permite realizar ediciones en un file, con todas las ediciones deshechas después de la confirmación

Por la documentation:

Para comprometer solo las partes del file que se relacionan con un problema específico:

  1. en el cuadro de dialog de confirmación, haga clic derecho en el file, elija "restaurar después de confirmar"
  2. edite el file en, por ejemplo, TortoiseMerge: deshaga los cambios que aún no quiere comprometer
  3. guarda el file
  4. cometer el file

Lo he hecho usando TortoiseSVN .

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

Use la function crear copy de security de la utilidad diff

  1. Vaya a confirmar su file como si fuera a enviar todos sus cambios.
  2. En la window de confirmación, haga doble clic en el file para mostrar una diferencia.
  3. En la configuration de diff, click la opción para hacer una copy de security del file original .
  4. Haga clic con el button derecho en los cambios que no desea y use seleccionar usar otro bloque de text .
  5. Guarde la diferencia exactamente una vez . La copy de security se sobrescribirá cada vez que guarde. Es por eso que solo quieres save una vez.
  6. Confirma el cambio
  7. Sobrescriba el original con el file .bak creado (que tendrá todos sus cambios originales).
  8. Commita su file.

Ahora debe tener todos sus cambios confirmados, usando dos commits separados.

Pruebe usar svn diff > out.patch luego copie el file out.patch.add en out.patch.add y out.patch.modify

Solo cuando tienes un file de parche que funcione, revierte el file original usando svn revert out.c

Edite los files de parches a mano de manera que solo contengan los lockings para agregar o modificar. Aplíquelos al file original usando el command patch , pruebe si la adición funcionó, luego svn commit the addition.

Lave la repetición de enjuague para el parche out.patch.modify .

Si los cambios están separados en el file como lo indicó 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 compromisos.

También podría haber revisado varias copys de trabajo de la misma fuente para aplicar su trabajo en contra de:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Asegúrese de svn up y probar para asegurarse de que todo esté bien.

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

4.4.1. El dialog de compromiso

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

<snip>

4.4.3. Commitir solo partes de files

En ocasiones, solo desea confirmar partes de los cambios que realizó en un file. Tal situación generalmente ocurre cuando estás trabajando en algo, pero luego se debe comprometer una solución urgente, y esa solución está en el mismo file en el que estás trabajando.

Haga clic derecho en el file y use el menu contextual → Restaurar después de confirmar. Esto creará una copy del file tal como está. Luego puede editar el file, por ejemplo, en TortoiseMerge y deshacer todos los cambios que no desee confirmar. Después de save esos cambios, puede confirmar el file.

Después de que se complete la confirmación, la copy del file se restaura automáticamente y usted tiene el file con todas sus modificaciones que no fueron confirmadas.

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

Solía ​​hacer esto:

  • En mi editor (yo uso vim), edite el file para que solo aparezca uno de los cambios
  • Guarde el file (pero no salga del editor)
  • Confirmar el file modificado a svn
  • Pulse "deshacer" en el editor las veces suficientes para que el segundo set de cambios vuelva a aparecer
  • Guarde el file de nuevo
  • Confirme el segundo set de cambios.

Este es un enfoque simplist que supone que un set de cambios es razonablemente fácil de deshacer. Para situaciones más complejas, me rendiría y comprometería ambos cambios sin preocuparme por ello.

¡Ahora que uso git, esto es algo que espero que nunca tenga que volver a hacer!

Utilizo un repository de darcs local o simplemente fusiono los cambios de forma gradual. Con la fusión (opendiff abre FileMerge, un progtwig de fusión que viene con Xcode, reemplace con su herramienta de fusión favorita):

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

fusionar los cambios relacionados, save la combinación, salir del progtwig 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 file, enjuague y repita (¿pero por qué esperaría tanto antes de comprometerse ?!)

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

  1. Abra todos los files que desee dividir en el editor de su elección
  2. Usando un set de herramientas diferente (en Win, use la sugerencia de Spike (la versión anterior)) vuelva a salir el segundo set
  3. Cometer
  4. Regrese a su editor de elección y guarde todos los files

Es un poco más riesgoso que la sugerencia completa de Spike, pero puede ser más fácil de hacer. También asegúrese de probarlo primero en otra cosa, ya que algunos editores se rehusarán a savelo sobre un file que se haya cambiado a less que recargue ese file (perdiendo todos sus cambios)

Creo que una opción más fácil que generar files diff, reversión, etc., sería tener dos copys del repository revisadas, y usar una herramienta visual diff como DeltaWalker para copyr trozos de uno a otro.

La primera copy sería la que realmente trabajas, y la segunda sería solo para este propósito. Una vez que ha realizado una tonelada de cambios en la primera, puede copyr una sección en la segunda, confirmarla, copyr otra sección, confirmarla, etc.

  1. Copie todos los files modificados correspondientes a las copys de security.
  2. Cree un parche del estado de trabajo usando svn diff .
  3. Revertir los files usando svn revert .
  4. Vuelva a aplicar las partes del parche que desea comprometer, ya sea utilizando la herramienta de patch , o mediante edición manual, o lo que sea.
  5. Ejecute diff posteriormente para comparar su copy de trabajo con su copy de security para asegurarse de haber aplicado las piezas de parche correctamente.
  6. Construir y probar
  7. Cometer.
  8. Copie sus copys de respaldo a su salida del repository.
  9. Repita en 2. (¡no en 1.!) Hasta que esté listo.