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 confirmar ambos cambios como uno confirmar, sino como dos cometidos independientes.
En un repositorio de git utilizaría el modo interactivo de git-add (1) para dividir el trozo en los más pequeños:
git add --patch
¿Cuál es la forma más fácil de hacer esto con Subversion? (Tal vez incluso utilizando un plugin de Eclipse)
Actualización:
En The Thing About Git , Ryan lo llama: "El problema de la copia de trabajo enredada".
Con git-svn puede hacer un repositorio GIT local del repositorio SVN remoto, trabajar con él utilizando el conjunto completo de funciones GIT (incluidas las confirmaciones parciales) y luego enviarlo todo al repositorio SVN.
Tortoise SVN 1.8 ahora es compatible 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:
- 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 aún no desea confirmar
- guarda el archivo
- cometer el archivo
Lo he hecho usando TortoiseSVN .
La utilidad integrada de combinación le permite mostrar una diferencia entre la versión del repositorio y su copia de trabajo.
Utilice la función crear copia de seguridad de la utilidad diff
Ahora deberías tener todos tus cambios confirmados, usando dos confirmaciones separadas.
Intente utilizar svn diff > out.patch
y luego copie el archivo out.patch
a out.patch.add
y out.patch.modify
Solo cuando tienes un archivo de parche activo revertir el archivo original usando svn revert out.c
.
Edite los archivos de parche a mano para que solo contengan hunks para agregar o modificar. Aplíquelos al archivo original usando el comando patch
, pruebe si la adición funcionó, luego svn commit
la adición.
Lave el enjuague y repita para el parche out.patch.modify
.
Si los cambios están separados en el archivo como se indicó en su pregunta inicial, se agregó un nuevo método, se 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 sacado 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 escribir svn up
y hacer una prueba para asegurarse de que todo está bien.
Esto es posible utilizando TortoiseSvn (Windows) desde v1.8.
4.4.1. El diálogo de cometer
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. Cometer solo partes de archivos
En ocasiones, solo desea confirmar partes de los cambios realizados en un archivo. Esta situación suele suceder cuando se está trabajando en algo, pero luego hay que confirmar una solución urgente, y esa solución está en el mismo archivo en el que se está trabajando.
haga clic con el botón derecho en el archivo y use Menú contextual → Restaurar después de confirmar. Esto creará una copia del archivo tal como está. Luego puedes editar el archivo, por ejemplo. en TortoiseMerge y deshaga todos los cambios que no quiera confirmar. Después de guardar esos cambios puedes cometer el archivo.
Una vez finalizada 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 un intento. Aunque no lo he probado yo mismo.
Solía hacer esto:
Este es un enfoque simplista que asume que un conjunto de cambios es razonablemente fácil de deshacer. Para situaciones más complejas, me gustaría renunciar y cometer ambos cambios sin preocuparme por ello.
¡Ahora que uso git, esto es algo que espero no volver a tener que hacer!
Utilizo un repositorio local de darcs, o simplemente fusiono los cambios gradualmente. Con la fusión (opendiff abre FileMerge, un programa de combinación que viene con Xcode; reemplaza con tu herramienta de combinación favorita):
cp file file.new
svn revert file
opendiff file.new file -merge file
fusionar los cambios relacionados, guardar la combinación, salir del programa de combinació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 tiempo antes de cometerlo?)
Además, si conoce git, puede utilizar git-svn para mantener un repositorio de git local y sincronizar sus confirmaciones con un servidor maestro svn; Funciona muy bien en mi experiencia limitada.
Probar VisualSVN para Visual Studio . La última versión 6.1 introduce la función QuickCommit. Puede confirmar parcialmente los cambios seleccionados en un archivo utilizando el nuevo Confirmar este bloque y Confirmar selección Comandos del menú contextual en el editor de Visual Studio.
Es un poco más arriesgado que la sugerencia completa de Spike, pero puede ser más fácil de hacer. También asegúrate de intentarlo en otra cosa primero, ya que algunos editores se negarán a guardar sobre un archivo que ha cambiado desde debajo de ellos a menos que vuelvas a cargar ese archivo (perdiendo todos tus cambios)
Creo que una opción más fácil que generar archivos diff, revertir, etc., sería tener dos copias del repositorio desprotegidas, y usar una herramienta de diferencias visuales como DeltaWalker para copiar fragmentos de uno a otro.
La primera copia sería la de la que realmente trabajaste, y la segunda sería solo para este propósito. Una vez que haya realizado una tonelada de cambios en la primera, puede copiar una sección a la segunda, confirmarla, copiar otra sección, confirmarla, etc.
svn diff
.svn revert
.patch
, o editando manualmente, o lo que sea.diff
luego para comparar su copia de trabajo con su copia de seguridad para asegurarse de que aplicó las partes del parche correctamente.