martes, 4 de noviembre de 2014

SVN: Reintegrate a Branch to Trunk

SVN: Reintegrar una rama al tronco

¿Cómo reintegrar un branch al trunk?

La idea es que cuando trabajamos con un branch, que es una rama del trunk, despues de un tiempo, cuando hayamos finalizado de trabajar con esta rama habrá que reintegrarla en el trunk haciendo un merge al mismo. El proceso a seguir puede ser el siguiente:

1) Primero traemos los cambios del trunk al branch


svn co https://REPO/branches/BRANCH --ignore-externals
cd BRANCH
#BRANCH]$ svn up --ignore-externals
BRANCH]$ svn merge ^/trunk
BRANCH]$ svn diff -N > merge_log.txt
#BRANCH]$ svn commit -m "Leyenda del Merge"
BRANCH]$ svn commit -F merge_log.txt

Esto se puede hacer previamente cada vez que se hace el reintegrate. Luego de que nuestro branch tiene todos los cambios actualizados del trunk podemos mezclarlos con los del trunk en el trunk (o sea comitear al trunk).

2) Despues llevamos los cambios del branch al trunk


svn co https://REPO/trunk trunk_workingcopy --ignore-externals
cd trunk_workingcopy
#trunk_workingcopy ]$ svn up --ignore-externals
trunk_workingcopy ]$ svn merge --reintegrate ^/branches/BRANCH
#Revisar los cambios
trunk_workingcopy ]$ $svn st
trunk_workingcopy ]$ svn diff -N > reintegrate_branch_to_trunk.log
#Ejecutar el comando para eliminar los comentarios de merge info:
#trunk_workingcopy ]$ svn st *|grep '^.M'|sed -re 's/^ *[A-Z]+ +//'|xargs -r svn pd svn:mergeinfo
#Commitear con leyenda:
#trunk_workingcopy ]$ svn commit -m "Reintegrate X"
Committed revision 392.

3) Después borramos el branch 

Después que el branch fue reintegrado y que se sabe que no se va a trabajar mas en ese branch se puede borrar.

$ svn delete https://REPO/branches/BRANCH \
             -m "Remove my branch, reintegrated with trunk in r392"
Committed revision 393.

4) Observación del reintegrate


Una vez que se hizo reintegrate no se debe volver a usar el branch ni a hacer otra vez reintegrate. ¿Por qué? Luego de hacer el reintegrate y subir los cambios: a) El trunk queda con los cambios que están en el branch; b) Cuando se vuelva a hacer merge del trunk en el branch para reutilizarlo, es posible que salten conflictos. O sea que no se debería usar mas el branch y el branch conviene ser borrado. Pero en caso de que se quiera hacer la excepción se puede hacer lo siguiente:

Lo que se puede hacer, para que no salten conflictos despes de hacer un reintegrate o revertir un reintegrate, es puentear el merge (que viene después del commit, pongamosle que actualiza el branch a la version  222)
Ejemplo:
podemos puentear el merge (que viene después del commit)
[branch]$   svn merge --record-only -c 222 ^/trunk

Con esto evitamos que haga el merge con los cambios que ya fueron comiteados en la version 222.


O sea que, no es aconsejable reutilizar un branch despues de un reintegrate, pero es más que nada por una cuestión de conflictos. Que de requerirse se puede reutilizar usando svn merge --record-only -c  <version> luego del commit.


No hay comentarios:

Publicar un comentario