Pregunta ¿Qué significa "rama", "etiqueta" y "tronco" en los repositorios de Subversion?


He visto muchas veces estas palabras en las discusiones de Subversion (y supongo que en el repositorio general). He estado utilizando SVN para mis proyectos en los últimos años, pero nunca he captado el concepto completo de estos directorios.

¿Qué quieren decir?


1131
2017-08-19 13:22


origen


Respuestas:


Hmm, no estoy seguro de estar de acuerdo con que Nick re tag sea similar a una sucursal. Una etiqueta es solo un marcador

  • El maletero sería el principal cuerpo de desarrollo, desde el inicio del proyecto hasta el presente.

  • Rama será una copia del código derivado de un cierto punto en el tronco que se usa para aplicar cambios importantes al código mientras se preserva la integridad del código en el tronco. Si los principales cambios funcionan de acuerdo con el plan, generalmente se fusionan en el tronco.

  • Etiqueta será un punto en el tiempo en el tronco o una rama que desea preservar. Las dos razones principales para la preservación serían que, o bien esta es una versión principal del software, ya sea alfa, beta, RC o RTM, o este es el punto más estable del software antes de que se aplicaran las principales revisiones en el troncal.

En los proyectos de fuente abierta, las principales ramas que no son aceptadas en el tronco por las partes interesadas del proyecto pueden convertirse en las bases para tenedores - por ejemplo, proyectos totalmente separados que comparten un origen común con otro código fuente.


864
2017-08-19 13:35



En primer lugar, como señalan @AndrewFinnell y @KenLiu, en SVN los nombres de los directorios en sí mismos no significan nada: "tronco, ramas y etiquetas" son simplemente una convención común que es utilizada por la mayoría de los repositorios. No todos los proyectos usan todos los directorios (es razonablemente común no usar "etiquetas") y, de hecho, nada le impide llamarlos de la forma que prefiera, aunque las normas de ruptura a menudo son confusas.

Describiré probablemente el escenario de uso más común de ramas y etiquetas, y daré un ejemplo de cómo se usan.

  • El maletero: El área de desarrollo principal. Aquí es donde vive su próxima versión principal del código, y generalmente tiene todas las funciones más recientes.

  • Sucursales: Cada vez que lanzas una versión principal, se crea una rama. Esto le permite hacer correcciones de errores y hacer una nueva versión sin tener que lanzar las funciones más nuevas, posiblemente inacabadas o no probadas.

  • Etiquetas: Cada vez que publica una versión (versión final, versión de candidatos (RC) y versiones beta) la etiqueta. Esto le proporciona una copia puntual del código tal como estaba en ese estado, lo que le permite retroceder y reproducir cualquier error si es necesario en una versión anterior, o volver a lanzar una versión anterior exactamente como estaba. Las ramas y etiquetas en SVN son livianas: en el servidor, no hace una copia completa de los archivos, solo un marcador que dice "estos archivos se copiaron en esta revisión" que solo ocupa unos pocos bytes. Con esto en mente, nunca debería preocuparse por crear una etiqueta para ningún código publicado. Como dije anteriormente, las etiquetas a menudo se omiten y, en cambio, un registro de cambios u otro documento aclara el número de revisión cuando se realiza una publicación.


Por ejemplo, supongamos que comienzas un nuevo proyecto. Comienzas a trabajar en "trunk", en lo que finalmente se lanzará como versión 1.0.

  • trunk / - versión de desarrollo, que pronto será 1.0
  • ramas / - vacío

Una vez que finalice 1.0.0, ramas de tronco en una nueva rama "1.0" y crear una etiqueta "1.0.0". Ahora trabaja en lo que finalmente será 1.1 continúa en el maletero.

  • trunk / - versión de desarrollo, pronto será 1.1
  • branches / 1.0 - 1.0.0 versión de lanzamiento
  • etiquetas / 1.0.0 - 1.0.0 versión de lanzamiento

Te encuentras con algunos errores en el código, los arreglas en el tronco y luego fusionas las correcciones en la rama 1.0. También puede hacer lo opuesto, corregir los errores en la rama 1.0 y luego fusionarlos de nuevo en el enlace troncal, pero comúnmente los proyectos se quedan con la fusión de un solo sentido para disminuir la posibilidad de perder algo. A veces, un error solo se puede corregir en 1.0 porque está obsoleto en 1.1. Realmente no importa: solo quiere asegurarse de que no libera 1.1 con los mismos errores que se han corregido en 1.0.

  • trunk / - versión de desarrollo, que pronto será 1.1
  • ramas / 1.0 - próxima versión 1.0.1
  • etiquetas / 1.0.0 - 1.0.0 versión de lanzamiento

Una vez que encuentre suficientes errores (o tal vez un error crítico), decide hacer una versión 1.0.1. Por lo tanto, crea una etiqueta "1.0.1" desde la rama 1.0 y libera el código. En este punto, trunk contendrá lo que será 1.1, y la rama "1.0" contiene 1.0.1 código. La próxima vez que suelte una actualización a 1.0, sería 1.0.2.

  • trunk / - versión de desarrollo, que pronto será 1.1
  • ramas / 1.0 - próxima versión 1.0.2
  • etiquetas / 1.0.0 - 1.0.0 versión de lanzamiento
  • tags / 1.0.1 - versión de lanzamiento 1.0.1

Finalmente, está casi listo para lanzar 1.1, pero primero quiere hacer una beta. En este caso, es probable que haga una rama "1.1" y una etiqueta "1.1beta1". Ahora, el trabajo en lo que será 1.2 (o 2.0 quizás) continúa en el tronco, pero el trabajo en 1.1 continúa en la rama "1.1".

  • trunk / - versión de desarrollo, pronto será 1.2
  • branches / 1.0 - próxima versión 1.0.2
  • branches / 1.1 - próxima versión 1.1.0
  • etiquetas / 1.0.0 - 1.0.0 versión de lanzamiento
  • tags / 1.0.1 - versión de lanzamiento 1.0.1
  • tags / 1.1beta1 - 1.1 beta 1 versión de lanzamiento

Una vez que libera 1.1 final, hace una etiqueta "1.1" de la rama "1.1".

También puede continuar manteniendo 1.0 si lo desea, portando correcciones de errores entre las tres ramas (1.0, 1.1 y troncal). Lo importante es que para cada versión principal del software que está manteniendo, tiene una sucursal que contiene la última versión de código para esa versión.


Otro uso de las ramas es para las características. Aquí es donde se ramifica el tronco (o una de sus ramas de liberación) y se trabaja en una nueva característica aisladamente. Una vez que se completa la función, la fusiona de nuevo y elimina la rama.

  • trunk / - versión de desarrollo, que pronto será 1.2
  • branches / 1.1 - próxima versión 1.1.0
  • branches / ui-rewrite - rama de características experimentales

La idea es cuando trabajas en algo perturbador (que podría retrasar o interferir con el trabajo de otras personas), algo experimental (que incluso puede no serlo), o posiblemente algo que lleva mucho tiempo. (y tiene miedo si mantiene una versión 1.2 cuando está listo para ramificar 1.2 desde el tronco), puede hacerlo de forma aislada en la rama. En general, lo mantienes actualizado con el tronco al fusionar los cambios en él todo el tiempo, lo que hace que sea más fácil volver a integrarlo (fusionar de nuevo al tronco) cuando hayas terminado.


También tenga en cuenta que el esquema de control de versiones que utilicé aquí es solo uno de muchos. Algunos equipos realizarían versiones de reparación / mantenimiento de errores como 1.1, 1.2, etc., y cambios importantes como 1.x, 2.x, etc. El uso aquí es el mismo, pero puede nombrar la rama "1" o "1" .x "en lugar de" 1.0 "o" 1.0.x ". (Aparte, versión semántica es una buena guía sobre cómo hacer números de versión).


536
2017-09-20 19:00



Además de lo que Nick ha dicho, puedes encontrar más información en Líneas de transmisión por secuencias: patrones de ramificación para el desarrollo paralelo de software

enter image description here

En esta figura main es el baúl, rel1-maint es una rama y 1.0 es una etiqueta.


92
2017-08-19 13:58



En general (herramienta vista agnóstica), una rama es el mecanismo utilizado para el desarrollo paralelo. Un SCM puede tener de 0 a n ramas. Subversion tiene 0.

  • El maletero es una rama principal recomendado por Subversion, pero de ninguna manera estás obligado a crearlo. ¡Podría llamarlo 'principal' o 'lanzamientos', o no tener uno!

  • Rama representa un esfuerzo de desarrollo. Nunca debe nombrarse después de un recurso (como 'vonc_branch') sino después de:

    • un propósito 'myProject_dev' o 'myProject_Merge'
    • un perímetro de liberación 'myProjetc1.0_dev'or myProject2.3_Merge' o 'myProject6..2_Patch1' ...
  • Etiqueta es una instantánea de los archivos con el fin de volver fácilmente a ese estado. El problema es que la etiqueta y la rama son las mismas en Subversion. Y definitivamente recomendaría el enfoque paranoico:

    puede usar uno de los scripts de control de acceso provistos con Subversion para evitar que alguien haga algo más que crear nuevas copias en el área de etiquetas.

Una etiqueta es final. Su contenido nunca debe cambiar. NUNCA. Nunca. ¿Olvidaste una línea en la nota de lanzamiento? Crea una nueva etiqueta. Obsoleto o eliminar el anterior.

Ahora, leo mucho sobre "fusionar tal y tal en tal o cual rama, y ​​finalmente en la rama del tronco". Eso es llamado fusionar flujo de trabajo y ahí está nada obligatorio aquí. No es porque tengas una rama de tronco que tiene que fusionarse de nuevo cualquier cosa.

Por convención, la rama troncal puede representar el estado actual de su desarrollo, pero eso es para un proyecto secuencial simple, que es un proyecto que tiene:

  • no hay desarrollo 'de antemano' (para la preparación de la próxima versión que implica tales cambios que no son compatibles con el desarrollo 'troncal' actual)
  • sin refactorización masiva (para probar una nueva opción técnica)
  • sin mantenimiento a largo plazo de una versión anterior

Porque con uno (o todos) de esos escenarios, obtienes cuatro 'troncos', cuatro 'desarrollos actuales', y no todo lo que haces en esos desarrollos paralelos necesariamente tendrá que fusionarse en 'tronco'.


73
2017-08-19 13:25



En SVN, una etiqueta y una rama son muy similares.

Etiqueta = un segmento definido en el tiempo, generalmente utilizado para las versiones

Rama = también un segmento definido en el tiempo en el que el desarrollo puede continuar, usualmente usado para una versión principal como 1.0, 1.5, 2.0, etc., luego, cuando lo suelta, etiqueta la rama. Esto le permite continuar respaldando una versión de producción mientras avanza con los cambios de última hora en el tronco.

El maletero= espacio de trabajo de desarrollo, aquí es donde debería ocurrir todo el desarrollo, y luego los cambios se fusionaron de las versiones de las sucursales.


36
2017-08-19 13:27



Realmente no tienen ningún significado formal. Una carpeta es una carpeta a SVN. Son una forma generalmente aceptada de organizar su proyecto.

  • El maletero es donde guardas tu línea principal de desarrollo. La carpeta de la rama es donde puedes crear, bueno, las ramas, que son difíciles de explicar en una publicación corta.

  • Una rama es una copia de un subconjunto de su proyecto que usted trabaja por separado del tronco. Tal vez sea para experimentos que quizás no vayan a ninguna parte, o tal vez sea para la próxima versión, que luego fusionarán nuevamente en el tronco cuando se estabilice.

  • Y la carpeta de etiquetas es para crear copias etiquetadas de su repositorio, generalmente en puntos de control de versiones.

Pero como dije, para SVN, una carpeta es una carpeta. branch, trunk y la etiqueta son solo una convención.

Estoy usando la palabra 'copiar' generosamente. SVN no hace copias completas de las cosas en el repositorio.


28
2017-08-19 13:37



los el maletero es la línea de desarrollo que contiene el último código fuente y características. Debería tener las últimas correcciones de errores y las últimas funciones agregadas al proyecto.

los ramas generalmente se usan para hacer algo alejado del tronco (u otra línea de desarrollo) que de otra manera descanso La construcción. Las nuevas características a menudo se crean en una rama y luego se fusionan de nuevo en el tronco. Las sucursales a menudo contienen código que no necesariamente está aprobado para la línea de desarrollo desde la que se ramificó. Por ejemplo, un programador podría intentar una optimización en algo de una rama y solo volver a fusionarse en la línea de desarrollo una vez que la optimización sea satisfactoria.

los etiquetas son instantáneas del repositorio en un momento determinado. Ningún desarrollo debería ocurrir en estos. Con mayor frecuencia se usan para tomar una copia de lo que se le dio a un cliente para que pueda tener acceso fácilmente a lo que el cliente está usando.

Aquí hay un enlace a una muy buena guía de repositorios:

Los artículos en Wikipedia también valen la pena leerlos.


12
2018-06-30 11:50