revertir - subir proyecto a svn
¿Subversion no fusiona los cambios en archivos renombrados? (4)
Creo que esto es un error de subversión existente, pero no aguante la respiración, ha estado abierto desde 2002.
Tengo el siguiente problema al usar subversión:
Actualmente estoy trabajando en el tronco de mi proyecto y planeo hacer algo de refactorización (que incluye cambiar el nombre de los archivos o mover los archivos a diferentes directorios).
Al mismo tiempo, alguien más está trabajando en el mismo proyecto en una sucursal.
En algún momento quiero fusionar los cambios realizados en la rama con el tronco. Eso incluye los cambios realizados en los archivos (en la rama) que han sido renombrados en el enlace troncal.
Hice algunas pruebas y parece que o la subversión no es capaz de seguir estos cambios o me falta algo (que es lo que espero). Probé esto usando el siguiente script (debería funcionar en bash, supone un repositorio svn en " http: // myserver / svn / sandbox "):
svn co http://myserver/svn/sandbox
cd sandbox/
mkdir -p MyProject/trunk MyProject/branches MyProject/tags
cat - <<EOF >MyProject/trunk/FileOne.txt
Test
1
2
EOF
svn add MyProject
svn commit -m "init"
# create a branch
svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1 svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1
# rename the file
svn move MyProject/trunk/FileOne.txt MyProject/trunk/FileTwo.txt
svn commit -m "renamed file"
svn update
# change the content of FileOne in branch
cat - <<EOF >MyProject/branches/Branch_1/FileOne.txt
Test
2
3
EOF
svn commit -m "changed branch"
# I now try to merge the changes in FileOne back to FileTwo
cd MyProject/trunk/
svn merge -r1:HEAD http://myserver/svn/sandbox/MyProject/branches/Branch_1
# but this yields the following message:
# Skipped missing target: ''FileOne.txt''
Cualquier ayuda es muy apreciada.
Editar: Tal vez el proceso sugerido por mikegrb podría automatizarse de alguna manera al generar primero un mapa de archivos renombrados (antiguos-> nuevos) del comando svn log en el tronco:
svn log -v
------------------------------------------------------------------------
r33 | sme | 2008-10-09 15:17:54 +0200 (Do, 09 Okt 2008) | 1 line
Changed paths:
D /MyProject/trunk/FileOne.txt
A /MyProject/trunk/FileTwo.txt (from /MyProject/trunk/FileOne.txt:31)
resulting map: {FileOne.txt => FileTwo.txt}
Ahora use este mapa para cambiar los nombres de los archivos en el parche generado en la sucursal.
Original:
Index: FileOne.txt
===================================================================
--- FileOne.txt (.../trunk) (revision 31)
+++ FileOne.txt (.../branches/Branch_1) (revision 34)
@@ -1,3 +1,3 @@
Test
-1
2
+3
modificado:
Index: FileTwo.txt
===================================================================
--- FileTwo.txt (.../trunk) (revision 31)
+++ FileTwo.txt (.../branches/Branch_1) (revision 34)
@@ -1,3 +1,3 @@
Test
-1
2
+3
Solo una idea, no lo he hecho todavía.
Desafortunadamente, esta es una de las limitaciones de la subversión. Cuando recientemente tuvimos una situación similar para tratar con nuestra solución fue crear un diff gigante para la sucursal y luego revisarlo archivo por archivo parcheando el tronco manualmente. Los archivos que han sido renombrados y no se encuentran harán que el parche solicite el parche del nombre del archivo. Muy sub óptimo. Tenga cuidado con los archivos binarios que no se mostrarán en el diff. Este fue uno de los factores más importantes que nos impulsó a evaluar otros sistemas de control de versiones y finalmente decidimos pasar a Git.
Es probable que deba cambiarles el nombre en la sucursal. ¿Puede fusionar la revisión que los renombró del tronco a la rama? Eso podría ahorrar algo de tiempo. De lo contrario, tendrá que cambiarles el nombre en la rama. Luego intenta fusionar de nuevo al tronco.
Una solución alternativa es sincronizar la rama con el tronco antes de sincronizar el tronco con la rama.
La diferencia es que trunk to branch tiene un archivo para aplicar cambios (movimiento) a, mientras que branch to trunk no tiene un archivo para aplicar cambios (modificar) a. Esto es simplemente porque SVN no parece rastrear dónde se mueven / renombran los archivos. No sé por qué no, con suerte hay una buena razón para ello.
Ejemplo:
- rev 1: /trunk/foo.txt movido a /trunk/folder/foo.txt
- rev 2: /branches/mybranch/foo.txt se modifica
Cómo fusionar foo.txt cambios en el tronco?
Solución:
- Combina todas las revisiones de trunk a mybranch y commit. Esto hará que foo.txt se mueva.
- Combina todas las revisiones de mybranch a trunk. Esto actualizará los contenidos de foo.txt, ya que ahora tienen la misma ruta.
Nota: Si ha movido / cambiado el nombre de diferentes archivos en trunk y mybranch, entonces estará listo para dar un paseo. Supongo que tendrá que combinar selectivamente los cambios para que pueda mover / cambiar el nombre primero en ambas direcciones, luego combinar los cambios.