He visto mucho estas palabras en torno a las discusiones de Subversion (y supongo que en el repositorio general).
He estado usando SVN para mis proyectos durante los últimos años, pero nunca he entendido el concepto completo de estos directorios.
¿Qué quieren decir?
Respuestas:
Hmm, no estoy seguro de estar de acuerdo con que Nick re tag sea similar a una rama. Una etiqueta es solo un marcador
Trunk sería el cuerpo principal de desarrollo, desde el inicio del proyecto hasta el presente.
Branch será una copia del código derivado de un cierto punto en el enlace troncal que se utiliza para aplicar cambios importantes al código mientras se preserva la integridad del código en el enlace troncal. Si los cambios principales funcionan según el plan, generalmente se fusionan nuevamente en el tronco.
La etiqueta será un momento en el tronco o una rama que desea conservar. Las dos razones principales para la preservación serían que 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 revisiones importantes en el tronco.
En proyectos de código abierto, las ramas principales que no son aceptadas en el tronco por las partes interesadas del proyecto pueden convertirse en la base de los tenedores , por ejemplo, proyectos totalmente separados que comparten un origen común con otro código fuente.
Los subárboles de rama y etiqueta se distinguen del tronco de las siguientes maneras:
Subversion permite a los administradores de sistemas crear scripts de enlace que se activan para su ejecución cuando ocurren ciertos eventos; por ejemplo, cometer un cambio en el repositorio. Es muy común que una implementación típica del repositorio de Subversion trate cualquier ruta que contenga "/ tag /" para que esté protegida contra escritura después de la creación; El resultado neto es que las etiquetas, una vez creadas, son inmutables (al menos para los usuarios "normales"). Esto se realiza a través de los scripts de enlace, que imponen la inmutabilidad al evitar cambios adicionales si la etiqueta es un nodo principal del objeto cambiado.
Subversion también ha agregado características, desde la versión 1.5, relacionadas con el "seguimiento de fusión de sucursales" para que los cambios comprometidos con una rama puedan fusionarse nuevamente en el tronco con soporte para la fusión incremental "inteligente".
fuente
Tags
El directorio también se usa a menudo para pruebas y verificación de hitos por parte del usuario habitual. Este sería un buen lugar para poner un prototipo también (solo algunas ideas sobre mi cabeza).En primer lugar, como señalan @AndrewFinnell y @KenLiu, en SVN los nombres de directorio en sí mismos no significan nada: "troncal, ramas y etiquetas" son simplemente una convención común 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 como desee, aunque romper la convención a menudo es confuso.
Probablemente describiré el escenario de uso más común de ramas y etiquetas, y daré un ejemplo de cómo se usan.
Tronco : El área principal de desarrollo. Aquí es donde vive su próxima versión principal del código, y generalmente tiene todas las características más nuevas.
Ramas : 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 características más recientes, posiblemente sin terminar o sin probar.
Etiquetas : cada vez que lanza una versión (versión final, versión candidatas (RC) y versiones beta), crea una etiqueta para ella. Esto le proporciona una copia del código en un punto en el tiempo tal como estaba en ese estado, lo que le permite regresar 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 debe 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 un lanzamiento.
Por ejemplo, supongamos que comienza un nuevo proyecto. Empiezas a trabajar en "trunk", en lo que finalmente se lanzará como versión 1.0.
Una vez que finaliza 1.0.0, ramifica el tronco en una nueva rama "1.0" y crea una etiqueta "1.0.0". Ahora trabaje en lo que finalmente será 1.1 continúa en el tronco
Te encuentras con algunos errores en el código, los reparas en el tronco y luego combinas las correcciones en la rama 1.0. También puede hacer lo contrario y corregir los errores en la rama 1.0 y luego fusionarlos nuevamente con el tronco, pero comúnmente los proyectos se quedan con la fusión en un solo sentido para disminuir la posibilidad de perder algo. A veces, un error solo se puede corregir en 1.0 porque es obsoleto en 1.1. Realmente no importa: solo desea asegurarse de no lanzar 1.1 con los mismos errores que se han corregido en 1.0.
Una vez que encuentre suficientes errores (o tal vez un error crítico), decide hacer una versión 1.0.1. Entonces crea una etiqueta "1.0.1" desde la rama 1.0 y libera el código. En este punto, el tronco contendrá lo que será 1.1, y la rama "1.0" contiene el código 1.0.1. La próxima vez que lance una actualización a 1.0, sería 1.0.2.
Finalmente, está casi listo para lanzar la versión 1.1, pero primero desea hacer una versión beta. En este caso, probablemente haga una rama "1.1" y una etiqueta "1.1beta1". Ahora, el trabajo en lo que será 1.2 (o tal vez 2.0) continúa en el tronco, pero el trabajo en 1.1 continúa en la rama "1.1".
Una vez que liberas 1.1 final, haces una etiqueta "1.1" desde 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). La conclusión importante es que para cada versión principal del software que está manteniendo, tiene una rama que contiene la última versión del código para esa versión.
Otro uso de las ramas es para las características. Aquí es donde ramifica el tronco (o una de sus ramas de lanzamiento) y trabaja en una nueva característica de forma aislada. Una vez que se completa la función, la vuelve a fusionar y elimina la rama.
La idea de esto es cuando estás trabajando en algo disruptivo (que podría retrasar o interferir con otras personas para que hagan su trabajo), algo experimental (que tal vez ni siquiera lo logre), o posiblemente algo que lleva mucho tiempo (y tiene miedo de que mantenga una versión 1.2 cuando esté listo para ramificarse 1.2 desde el tronco), puede hacerlo de forma aislada en rama. En general, lo mantiene actualizado con troncal fusionando los cambios en él todo el tiempo, lo que facilita la reintegración (fusión a troncal) cuando haya terminado.
También tenga en cuenta que el esquema de versiones que utilicé aquí es solo uno de muchos. Algunos equipos realizarían versiones de mantenimiento / corrección 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 ". (Además, el control de versiones semántico es una buena guía sobre cómo hacer los números de versión).
fuente
Además de lo que Nick ha dicho, puede encontrar más información en Streamed Lines: Patrones de ramificación para el desarrollo de software paralelo
En esta figura
main
está el tronco,rel1-maint
es una rama y1.0
es una etiqueta.fuente
En general (vista agnóstica de herramientas), una rama es el mecanismo utilizado para el desarrollo paralelo. Un SCM puede tener de 0 a n ramas. Subversion tiene 0.
Trunk es una rama principal recomendada por Subversion , pero de ninguna manera estás obligado a crearla. ¡Podría llamarlo 'principal' o 'lanzamientos', o no tener uno en absoluto!
Branch representa un esfuerzo de desarrollo. Nunca debe nombrarse después de un recurso (como 'vonc_branch') sino después de:
Tag es una instantánea de archivos para 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:
Una etiqueta es final. Su contenido nunca debería cambiar. NUNCA. Siempre. ¿Olvidó una línea en la nota de lanzamiento? Crea una nueva etiqueta. Obsoleto o eliminar el viejo.
Ahora, leo mucho sobre "fusionar tal y tal en tal y tal rama, y finalmente en la rama del tronco". Eso se llama flujo de trabajo de fusión y no hay nada obligatorio aquí . No es porque tenga una rama troncal que deba fusionar nada.
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:
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 nuevamente en 'troncal'.
fuente
En SVN, una etiqueta y una rama son muy similares.
Etiqueta = un segmento definido en el tiempo, generalmente usado para lanzamientos
Branch = también un segmento definido en el tiempo en el que el desarrollo puede continuar, generalmente se usa para versiones principales como 1.0, 1.5, 2.0, etc., luego, cuando lo libera, etiqueta la rama. Esto le permite continuar admitiendo una versión de producción mientras avanza con cambios importantes en el tronco
Troncal = espacio de trabajo de desarrollo, aquí es donde debería ocurrir todo el desarrollo, y luego los cambios se fusionaron con las versiones de la rama.
fuente
Realmente no tienen ningún significado formal. Una carpeta es una carpeta para SVN. Son una forma generalmente aceptada de organizar su proyecto.
El tronco es donde mantiene su línea principal de desarrollo. La carpeta de ramas es donde puedes crear, bueno, ramas, que son difíciles de explicar en una breve publicación.
Una rama es una copia de un subconjunto de su proyecto en el que trabaja por separado del tronco. Tal vez sea para experimentos que podrían no llegar a ningún lado, o tal vez sea para la próxima versión, que luego fusionará nuevamente en el tronco cuando se estabilice.
Y la carpeta de etiquetas es para crear copias etiquetadas de su repositorio, generalmente en los puntos de revisión de lanzamiento.
Pero como dije, para SVN, una carpeta es una carpeta.
branch
,trunk
y tag son solo una convención.Estoy usando la palabra 'copiar' generosamente. SVN en realidad no hace copias completas de las cosas en el repositorio.
fuente
El enlace troncal es la línea de desarrollo que contiene el código fuente y las funciones más recientes. Debería tener las últimas correcciones de errores, así como las últimas características agregadas al proyecto.
Las ramas generalmente se usan para hacer algo lejos del tronco (u otra línea de desarrollo) que de otro modo rompería la construcción. Las nuevas características a menudo se crean en una rama y luego se fusionan nuevamente en el tronco. Las ramas a menudo contienen código que no está necesariamente aprobado para la línea de desarrollo desde la que se bifurcó. Por ejemplo, un programador podría intentar una optimización en algo en una rama y solo fusionarse nuevamente en la línea de desarrollo una vez que la optimización sea satisfactoria.
Las etiquetas son instantáneas del repositorio en un momento determinado. Ningún desarrollo debe ocurrir en estos. Se usan con mayor frecuencia para tomar una copia de lo que se lanzó a un cliente para que pueda tener acceso fácilmente a lo que está utilizando un cliente.
Aquí hay un enlace a una muy buena guía de repositorios:
También vale la pena leer los artículos en Wikipedia.
fuente
Ahora que es lo que pasa con el desarrollo de software, no hay un conocimiento consistente sobre nada, todo el mundo parece tenerlo a su manera, pero eso es porque es una disciplina relativamente joven de todos modos.
Aquí está mi manera simple y simple,
trunk : el directorio de trunk contiene el cuerpo de trabajo más actual, aprobado y fusionado. Al contrario de lo que muchos han confesado, mi baúl es solo para trabajo limpio, ordenado y aprobado, y no es un área de desarrollo, sino más bien un área de liberación.
En un momento dado, cuando el tronco parece estar listo para liberarse, se etiqueta y se libera.
sucursales : el directorio de sucursales contiene experimentos y trabajos en curso. El trabajo debajo de una rama permanece allí hasta que se apruebe su fusión en el tronco. Para mí, esta es el área donde se realiza todo el trabajo.
Por ejemplo: puedo tener una rama de iteración 5 para una quinta ronda de desarrollo del producto, tal vez una rama prototipo 9 para una novena ronda de experimentación, y así sucesivamente.
etiquetas : el directorio de etiquetas contiene instantáneas de las ramas aprobadas y las versiones troncales. Cada vez que se aprueba la fusión de una rama en el tronco, o se realiza una liberación del tronco, se realiza una instantánea de la rama aprobada o la liberación del tronco debajo de las etiquetas.
Supongo que con las etiquetas puedo saltar de un lado a otro en el tiempo para señalar puntos de interés con bastante facilidad.
fuente
Encontré este gran tutorial sobre SVN cuando estaba buscando el sitio web del autor del libro de cocina de programación de aplicaciones de visión por computadora OpenCV 2 y pensé que debería compartirlo.
Tiene un tutorial sobre cómo usar SVN y lo que significan las frases 'trunk', 'tag' y 'branch'.
Citado directamente de su tutorial:
fuente
El directorio troncal es el directorio con el que probablemente esté más familiarizado, porque se utiliza para contener los cambios más recientes. Su código base principal debe estar en el tronco.
El directorio de sucursales es para mantener sus sucursales, sean las que sean.
El directorio de etiquetas es básicamente para etiquetar un determinado conjunto de archivos. Lo hace para cosas como lanzamientos, donde desea que "1.0" sean estos archivos en estas revisiones y "1.1" sean estos archivos en estas revisiones. Por lo general, no modifica las etiquetas una vez que están hechas. Para obtener más información sobre las etiquetas, consulte el Capítulo 4. Ramificación y fusión (en Control de versiones con Subversion ).
fuente
Una de las razones por las cuales todos tienen una definición ligeramente diferente es porque Subversion implementa cero soporte para ramas y etiquetas. Subversion básicamente dice: Observamos ramas y etiquetas con todas las funciones en otros sistemas y no las encontramos útiles, por lo que no implementamos nada. Simplemente haga una copia en un nuevo directorio con un nombre de convenciones lugar . Entonces, por supuesto, todos son libres de tener convenciones ligeramente diferentes. Para comprender la diferencia entre una etiqueta real y una simple convención de copia + nomenclatura, consulte la entrada de Wikipedia Etiquetas y ramas de Subversion .
fuente
Creo que esto es lo que normalmente se entiende por "etiqueta". Pero en Subversion:
lo cual me parece bastante confuso: un sistema de control de revisión que no sabe nada sobre ramas o etiquetas. Desde el punto de vista de la implementación, creo que la forma de Subversion de crear "copias" es muy inteligente, pero tener que saberlo es lo que llamaría una abstracción permeable .
O tal vez he estado usando CVS demasiado tiempo.
fuente
Creo que parte de la confusión proviene de la diferencia entre el concepto de una etiqueta y la implementación en SVN. Para SVN, una etiqueta es una rama que es una copia. La modificación de etiquetas se considera incorrecta y, de hecho, herramientas como TortoiseSVN le avisarán si intenta modificar algo con ../tags/ .. en la ruta.
fuente
No estoy realmente seguro de qué es 'etiqueta', pero la rama es un concepto de control de fuente bastante común.
Básicamente, una rama es una forma de trabajar en cambios en el código sin afectar el tronco. Digamos que desea agregar una nueva característica que es bastante complicada. Desea poder registrar los cambios a medida que los realiza, pero no desea que afecten al tronco hasta que haya terminado con la función.
Primero crearías una rama. Esto es básicamente una copia del tronco desde el momento en que hizo la rama. Entonces harías todo tu trabajo en la sucursal. Los cambios realizados en la rama no afectan a la troncal, por lo que la troncal aún puede utilizarse, lo que permite que otros continúen trabajando allí (como hacer correcciones de errores o pequeñas mejoras). Una vez que haya terminado su función, integraría la rama nuevamente en el tronco. Esto movería todos sus cambios de la rama a la troncal.
Hay una serie de patrones que las personas usan para las ramas. Si tiene un producto con múltiples versiones principales compatibles a la vez, generalmente cada versión sería una rama. Donde trabajo tenemos una sucursal de control de calidad y una sucursal de producción. Antes de lanzar nuestro código al control de calidad, integramos los cambios en la rama de control de calidad y luego lo implementamos desde allí. Al lanzar a producción, integramos desde la rama de control de calidad a la rama de producción, por lo que sabemos que el código que se ejecuta en producción es idéntico a lo que probó el control de calidad.
Aquí está la entrada de Wikipedia en las ramas , ya que probablemente explican las cosas mejor que yo. :)
fuente
Tronco : después de completar cada sprint en ágil, salimos con un producto parcialmente enviable. Estas versiones se mantienen en el maletero.
Sucursales : todos los códigos de desarrollos paralelos para cada sprint en curso se mantienen en sucursales.
Etiquetas : cada vez que lanzamos una versión beta de un producto parcialmente enviable, hacemos una etiqueta para ello. Esto nos da el código que estaba disponible en ese momento, lo que nos permite volver a ese estado si es necesario en algún momento durante el desarrollo.
fuente
Para las personas familiarizadas con GIT, master en GIT es equivalente a troncal en SVN.
La rama y la etiqueta tienen la misma terminología tanto en GIT como en SVN.
fuente