2008-10-09 23 views
25

Tengo el siguiente problema utilizando la subversión:¿Subversion no fusiona los cambios en archivos renombrados?

Actualmente estoy trabajando en el maletero de mi proyecto y un plan para hacer algo de refactorización (que incluye el cambio de nombre de archivos o mover archivos a diferentes directorios).

Al mismo tiempo, alguien más está trabajando en el mismo proyecto en una sucursal.

En algún momento deseo 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 utilizando la siguiente secuencia de comandos (debería funcionar en bash, asume 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 por tanto automatizado primero al generar un mapa de archivos renombrados (Antiguo-> nuevos) desde el 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 utilice este mapa para cambiar los nombres de archivo en el archivo de 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 

modificación:

Index: FileTwo.txt 
=================================================================== 
--- FileTwo.txt (.../trunk)  (revision 31) 
+++ FileTwo.txt (.../branches/Branch_1) (revision 34) 
@@ -1,3 +1,3 @@ 
Test 
-1 
2 
+3 

sólo una idea, no lo han hecho todavía.

Respuesta

22

creo que esto es una subversión existente bug - pero no contener la respiración, su estado abierto desde 2002.

+2

Parece que llevaron este error a la versión 1.8. Lo cual es solo otra forma de decir "todavía no". Desde que ha estado abierto desde 2002, comienza a parecerse más a "nunca". –

+1

@deft_code ¿Ha solucionado este error desde entonces? Creo que puedo experimentar algo similar en este momento. Cambié el nombre de un par de archivos usando la función de cambio de nombre de tortoisesvns, y ahora cuando trato de fusionarme desde el tronco a mi rama (para verificar si se está compilando antes de reintegrarme al tronco) dice "omitido objetivo omitido" – TravisG

+0

@TravisG - el error hace referencia a Es posible que se haya solucionado en 1.8, que puede haber aparecido esta semana (hubo un lanzamiento de git, no estoy seguro de la versión). Todavía estoy en 1.7 yo mismo ... ¿En qué versión estás? –

1

Es probable que deba cambiar 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.

11

Lamentablemente, 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.

+4

técnicamente Git tampoco tiene soporte de cambio de nombre verdadero. Sin embargo, realizan conjeturas, que es mejor que SVN. Bazar es el único VCS de código abierto que admite el cambio de nombre verdadero. –

1

Una solución consiste en 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 trasladó a /trunk/folder/foo.txt
  • rev 2: /branches/mybranch/foo.txt se modifica

¿Cómo combinar los cambios de foo.txt en el tronco?

Solución:

  1. Combinar todas las revisiones de tronco para MyBranch y cometen. Esto hará que foo.txt se mueva.
  2. Fusiona todas las revisiones de mybranch en el maletero. Esto actualizará los contenidos de foo.txt, ya que ahora tienen la misma ruta.

Nota: Si ha movido/cambiado el nombre de diferentes archivos tanto en trunk como en 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.

Cuestiones relacionadas