svn - tag - Compromisos parciales con Subversion
tag svn (11)
Dado el caso hice dos cambios independientes en un archivo: 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 repositorio 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 copia de trabajo enredada".
- Abra todos los archivos que desee dividir en editor de elección
- Usando un conjunto de herramientas diferente (en Win, use la sugerencia de Spike (la versión anterior)) vuelva a salir el segundo conjunto
- Cometer
- Regrese a su editor de elección y guarde todos los archivos
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 guardarlo sobre un archivo que se haya cambiado a menos que recargue ese archivo (perdiendo todos sus cambios)
- Copie todos los archivos modificados correspondientes a las copias de seguridad.
- Cree un parche del estado de trabajo usando
svn diff
. - Revertir los archivos usando
svn revert
. - 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. - Ejecute
diff
posteriormente para comparar su copia de trabajo con su copia de seguridad para asegurarse de haber aplicado las piezas de parche correctamente. - Construir y probar
- Cometer.
- Copie sus copias de respaldo a su salida del repositorio.
- Repita en 2. (¡no en 1.!) Hasta que esté listo.
Con git-svn puede hacer un repositorio GIT local del repositorio SVN remoto, trabajar con él usando el conjunto completo de características GIT (incluidas las confirmaciones parciales) y luego llevarlo de vuelta al repositorio SVN.
Creo que una opción más fácil que generar archivos diff, reversión, etc., sería tener dos copias del repositorio revisadas, y usar una herramienta visual diff como DeltaWalker para copiar trozos de uno a otro.
La primera copia 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 copiar una sección en la segunda, confirmarla, copiar otra sección, confirmarla, etc.
Esto es posible usando TortoiseSvn (Windows) desde v1.8.
4.4.1. El diálogo de compromiso
Si su copia de trabajo está actualizada y no hay conflictos, está listo para confirmar sus cambios. Seleccione cualquier archivo y / o carpeta que quiera confirmar, luego TortoiseSVN → Confirmar ...
<snip>
4.4.3. Commitir solo partes de archivos
En ocasiones, solo desea confirmar partes de los cambios que realizó en un archivo. 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 archivo en el que estás trabajando.
Haga clic derecho en el archivo y use el 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 desee confirmar. Después de guardar esos cambios, puede confirmar el archivo.
Después de que se complete la confirmación, la copia del archivo se restaura automáticamente y usted tiene el archivo 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.
Lo he hecho usando TortoiseSVN .
La utilidad de combinación incorporada le permite mostrar una diferencia entre la versión del repositorio y su copia de trabajo.
Use la función crear copia de seguridad de la utilidad diff
- Vaya a confirmar su archivo como si fuera a enviar todos sus cambios.
- En la ventana de confirmación, haga doble clic en el archivo para mostrar una diferencia.
- En la configuración de diff, haga clic en la opción para hacer una copia de seguridad del archivo original .
- Haga clic con el botón derecho en los cambios que no desea y use seleccionar usar otro bloque de texto .
- Guarde la diferencia exactamente una vez . La copia de seguridad se sobrescribirá cada vez que guarde. Es por eso que solo quieres guardar una vez.
- Confirma el cambio
- Sobrescriba el original con el archivo .bak creado (que tendrá todos sus cambios originales).
- Commita su archivo.
Ahora debe tener todos sus cambios confirmados, usando dos commits separados.
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 Commit this Block y Commit Selection en el editor de Visual Studio.
Pruebe usar svn diff > out.patch
luego copie el archivo out.patch.add
en out.patch.add
y out.patch.modify
Solo cuando tienes un archivo de parche que funcione, revierte el archivo original usando svn revert out.c
Edite los archivos de parches a mano de manera que solo contengan los bloqueos para agregar o modificar. Aplíquelos al archivo original usando el comando 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 archivo 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 copias 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.
Solía hacer esto:
- En mi editor (yo uso vim), edite el archivo para que solo aparezca uno de los cambios
- Guarde el archivo (pero no salga del editor)
- Confirmar el archivo modificado a svn
- Pulse "deshacer" en el editor las veces suficientes para que el segundo conjunto de cambios vuelva a aparecer
- Guarde el archivo de nuevo
- Confirme el segundo conjunto de cambios.
Este es un enfoque simplista que supone que un conjunto 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!
Tortoise SVN 1.8 ahora admite esto con su función "Restaurar después de confirmar". Esto le permite realizar ediciones a un archivo, con todas las ediciones deshechas después de la confirmación
Por la documentación:
Para comprometer solo las partes del archivo que se relacionan con un problema específico:
- en el cuadro de diálogo de confirmación, haga clic derecho en el archivo, elija "restaurar después de confirmar"
- edite el archivo en, por ejemplo, TortoiseMerge: deshaga los cambios que aún no quiere comprometer
- guarda el archivo
- cometer el archivo
Utilizo un repositorio de darcs local o simplemente fusiono los cambios de forma gradual. Con la fusión (opendiff abre FileMerge, un programa 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, guardar la combinació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 de git local y sincronizar sus confirmaciones con un servidor svn master; funciona muy bien en mi experiencia limitada.