tag - tortoise svn server
La fusión entre sucursales en Subversion no agrega todos los archivos nuevos. Por qué no? (4)
Los archivos que se agregaron a una bifurcación y luego se cambiaron en la bifurcación no se agregan al hacer una fusión en varias revisiones porque la subversión está intentando aplicar un contexto diff a un archivo que no existe en el directorio de trabajo (el archivo nuevo). Verás una advertencia de svn que dice algo así como "Omitir archivo faltante blah.c ..."
Hay dos formas básicas de lidiar con esto. Confirme su sucursal (esto siempre es una buena idea ya que fusionarse puede estropear las cosas a veces y es mucho más fácil simplemente revertir), luego combine cada revisión específica que agrega archivos (uno a la vez) para asegurar que los archivos de hecho, se agrega a tu directorio de trabajo.
La otra opción que tienes es crear archivos vacíos (por ejemplo, usando el comando táctil de Unix) para todos los archivos que se agregaron a través de las revisiones (puedes obtener una lista de estos archivos simplemente haciendo la fusión con el comando --dry-run especificador y tomando nota de todos los avisos de "omitir archivos perdidos"), luego ejecute la fusión con toda su lista de revisión (como -r 1023: 1040). Eso fusionará los cambios en los nuevos archivos vacíos y todo debería ser color de rosa :)
Tengo un árbol de código fuente en subversión con varias ramas. Acabo de terminar una sesión de depuración bastante intensa en una rama que de otro modo estaría activa y ahora necesito fusionar los cambios en la nueva rama. La nueva rama se quitó del tronco (que representa el código liberado) recientemente, después de todo el desarrollo en la rama anterior (obviamente) pero antes de que cometiera toda mi depuración. El intento de svn merge
, sin embargo, no se fusiona en todos los archivos que se agregaron. Agrega algunos, pero no todos.
Aquí está la cronología:
- Branch off trunk para crear la rama dev1.
- Codifica en dev1, modifica archivos y agrega archivos.
- Branch off trunk para crear branch dev2.
- Corrección de errores en dev1, modificación de archivos pero sin agregar archivos.
- Fusiona todos los cambios en dev1 a dev2.
Como se esperaba, hay muchos cambios, incluidos nuevos archivos, pero no todos. ¿Es porque el rango de versiones que estoy fusionando incluye la versión que creó la rama dev2? ¿O debería fusionarme con trunk y luego bajar a dev2?
Editar: todo el código está completamente comprometido con Subversion. Pero creo que lo que podría estar sucediendo es que las adiciones de archivos no se propagan a través de fusiones. Es decir, una fusión previa a dev1 agregó algunos archivos, pero una combinación de dev1 que incluye la confirmación de la combinación anterior no incluye los archivos agregados.
Pero todavía estoy revisando.
La siguiente declaración no es verdadera:
Los archivos que se agregaron a una bifurcación y luego se cambiaron en la sucursal no se agregan cuando se realiza una combinación en varias revisiones
Eso implicaría que la fusión está totalmente rota.
Cuando realice la combinación, debe asegurarse de fusionar la revisión que creó el archivo; de lo contrario, obtendrá esas advertencias sobre ningún objetivo.
La otra cosa a tener en cuenta es si realiza una fusión en una copia de trabajo, luego decide que no está contento con ella y revierte todo, los archivos recién agregados todavía estarán en la copia de trabajo, por lo que si se fusiona de nuevo, el los archivos no versionados evitarán la fusión de nuevos archivos allí, por lo que los extrañará. Por lo tanto, ejecutar "svn status" y eliminar los archivos no versionados garantizará que la fusión funcione correctamente.
El comentario sobre agregar un archivo vacío no debe hacerse, porque entonces el nuevo archivo no tiene un historial de dónde vino. En otras palabras, no es una copia, por lo que "svn log" no mostrará su historial. Y, por último, si el archivo era una foto de un gigabyte, no querría fusionarlo en un nuevo archivo, porque entonces el repositorio tendría dos copias del mismo contexto. La fusión y copia con historial ahorra almacenamiento de repositorio (al menos hasta que se repita el replicado).
Siempre he sabido que las advertencias de svn son una indicación de subversión de que te equivocaste de alguna manera. Luego me encontré con el caso anterior en el que recibía muchos archivos omitidos en una combinación de una rama, pero sabía que tenía las rutas correctas para la fusión. Los archivos omitidos fueron todos los archivos que se agregaron y los cambios en la bifurcación pero que aún no existían en el enlace troncal.
Luego me di cuenta de que todos estos archivos ya existían, aunque no versionados, en mi copia de trabajo del tronco. Había hecho una fusión de prueba (no una ejecución en seco) una semana antes y revertí, pero los archivos nunca fueron eliminados físicamente por mi SVN cliente. ¡Tan pronto como los borré físicamente de mi copia de trabajo del maletero, el problema desapareció!
(Dado que esta parece ser la publicación principal al buscar este problema, comentaré sobre otra posible causa del mismo comportamiento).
En mi caso, algunos de los cambios en la revisión que intentaba fusionar ya se habían fusionado manualmente por otro desarrollador y se habían comprometido en una revisión anterior . SVN estaba notando que los cambios ya estaban fusionados y no listaba los archivos en la fusión.
En este caso, solo debe verificar que los archivos estén realmente fusionados correctamente y continúen normalmente.