what manage how create branches git version-control branch vendor-branch

manage - merge a branch git



Vendedor de sucursales en Git (3)

Creo que los submódulos son el camino a seguir cuando se trata de "rama de proveedor".
Aquí es cómo debes usar submod ... hmmm, es broma.

Solo un pensamiento; usted quiere:

  • para desarrollar tanto el proyecto principal como el subproyecto dentro del mismo directorio (lo que se llama un " enfoque de sistema ": usted desarrolla, etiqueta y combina todo el sistema)
  • o para ver su subproyecto como una "rama de proveedor" (que es una rama que le permite acceder a una versión bien definida de un componente externo del proveedor, o "conjunto de archivos", y que solo se actualiza con el nuevo versione cada versión de ese componente externo: se denomina " enfoque por componentes "; todo el sistema se ve como una colección de componentes separados desarrollados por sí mismos)

Los dos enfoques no son compatibles:

  • La primera estrategia es compatible con una combinación de subárbol: está trabajando tanto en el proyecto como en el subproyecto.
  • El segundo se usa con submódulos, pero los submódulos se usan para definir una configuración (lista de etiquetas que necesita para trabajar): cada submódulo de git, a diferencia de svn: externals, está anclado a un identificador de confirmación particular, y eso es lo que le permite definir una configuración (como en S C M: "gestión de configuración de software")

Me gusta el segundo enfoque porque la mayoría de las veces, cuando tienes un proyecto y un subproyecto, su ciclo de vida es diferente (no se desarrollan al mismo ritmo, ni se etiquetan al mismo tiempo, ni con el mismo nombre) .

Lo que realmente impide ese enfoque ("basado en componentes") en su pregunta es la parte "ambos se pueden desarrollar y actualizar desde el mismo directorio de trabajo".
Realmente le insto a que reconsidere ese requisito, ya que la mayoría de los IDE son perfectamente capaces de tratar con múltiples directorios de "fuentes", y el desarrollo del subproyecto se puede hacer en su propio entorno dedicado.

samgoody agrega:

Imagine un plugin de eMap para Joomla y ModX. Tanto el complemento como el código específico de Joomla (que es parte de Joomla, no de eMap) se desarrollan mientras el complemento está dentro de Joomla. Todas las rutas son relativas, la estructura es rígida y deben distribuirse juntas, aunque cada proyecto tenga su propio ciclo de vida.

Si lo entiendo correctamente, está en una configuración donde el entorno de desarrollo (el conjunto de archivos en el que está trabajando) es bastante similar al entorno de distribución (el mismo conjunto de archivos se copia en la plataforma de lanzamiento)

Todo viene hecho a un problema de granularidad:

  • si ambos conjuntos de archivos no pueden existir uno sin el otro, entonces deberían verse como un gran proyecto (y un subárbol-fusionados), pero eso los fuerza a ser etiquetados y fusionados como uno solo. -si uno depende del otro (que puede desarrollarse solo), entonces deberían estar en su propio repositorio y proyecto Git, el primero dependiendo de un compromiso específico del segundo como un submódulo: si el submódulo es definido en el subárbol derecho del primer componente, se respetan todas las rutas relativas.

samgoody agrega:

El hilo original enumeraba los problemas con los submódulos, principalmente que la descarga de GitHub no los incluye (es vital para mí) y que se quedan atascados en un compromiso en particular.

No estoy seguro de que la descarga de GitHub sea un problema recientemente: el artículo " Guías: Desarrollo con submódulos " menciona:

Lo mejor de todo: las personas que clonen su horquilla my-awesome-framework no tendrán problemas para bajar su submódulo my-fantastic-plugin , ya que ha registrado la URL clónica pública para el submódulo. Los comandos

$ gh submodule init $ gh submodule update

Jalará los submódulos en el repositorio actual.

En cuanto a "se quedan atrapados en un compromiso en particular": ese es el punto central de un submódulo, que le permite trabajar con una configuración (lista de versiones etiquetadas de componentes) en lugar de un último conjunto de archivos potencialmente inestable.

samgoody menciona:

Necesito evitar tanto los subárboles como los submódulos (ver pregunta), y preferiría abordar esta necesidad sin discutir demasiado si el enfoque está justificado.

Su requisito es perfectamente legítimo, y no quiero juzgar su justificación: mis respuestas anteriores solo están aquí para proporcionar un contexto más amplio y tratar de ilustrar las opciones generalmente disponibles con una herramienta SCM genérica.

La fusión de subárboles debería ser la respuesta aquí, pero implicaría fusionar solo los commit realizados para los archivos del proyecto principal, y no los commits realizados para los subproyectos. Si puede administrar ese tipo de fusión parcial, creo que es el camino correcto a seguir.

No obstante, no veo una forma nativa de Git de hacer lo que quieras que no use subtree-merge o submodule.
Espero que un verdadero gurú de Git publique aquí una respuesta más adecuada.

Un proyecto de Git tiene dentro un segundo proyecto cuyo contenido se está trabajando independientemente.

Los submódulos no se pueden usar para los más pequeños, ya que incluso el subproyecto debe incluirse cuando los usuarios intentan clonar o descargar el ''padre''.

La combinación de subárboles no se puede utilizar, ya que el subproyecto se está desarrollando activamente, y la fusión de subárboles hace que sea muy difícil fusionar esas actualizaciones nuevamente en el proyecto original.

Me han informado que la solución se conoce en el mundo de SVN como "Ramas de proveedores", y que se hace tan simplemente en Git para que ni siquiera necesite direccionamiento. Tutoriales medio horneados abundan en la red.

No obstante, parece que no puedo hacer que funcione.

¿Alguien puede (por favor, por favor?) Explicar cómo puedo crear una estructura en la que un proyecto existe dentro de otro, y ambos pueden desarrollarse y actualizarse desde el mismo directorio de trabajo. Idealmente [o más bien: es bastante importante, si no se admite] que cuando un cliente intenta descargar el proyecto "principal", que se le debe dar la última versión del subproyecto automáticamente.

Por favor NO me explique cómo debo usar submódulos o combinaciones de subárboles o incluso SVN: Externos. Este subproceso es la consecuencia del siguiente subproceso SO , y si se omitió algo allí, publíquelo allí . Este hilo trata de comprender cómo vender ramas, y cuanto más larga, clara y dummida sea la explicación que reciba, más feliz seré.


Finalmente tengo unas horas de acceso a la red antes de regresar a las montañas. Veremos si tengo algo para aportar claridad a su situación.

Mi entendimiento (probablemente simplificado en exceso) es que tiene un (os) proveedor (es) externo (s) que desarrolla (n) plug-in para su proyecto donde su equipo (interno) está desarrollando código para su proyecto principal utilizando un marco de origen externo. El proveedor no realiza cambios en su código y probablemente no necesite su desarrollo de punta de lanza, pero sí necesita su código estable para desarrollar y probar su trabajo. Su equipo no realiza cambios en el marco, pero a veces contribuye a cambios en el complemento.

  1. Al igual que VonC (que generalmente piensa las cosas a fondo), no creo que Git se ajuste perfectamente a tus necesidades. Y, como él, creo que usar el patrón de combinación de subárbol es lo más parecido. No soy un gurú de Git, pero he tenido éxito en hacer que Git satisfaga una amplia gama de necesidades. Quizás Git no satisfaga tus necesidades:

    • SVN le permitirá tener varios repositorios dentro de uno, lo que parece importante para usted. Creo que esto significaría usar externalidades o el patrón de la Rama de proveedores para acercarse a lo que desea.

    • Mercurial tiene una extensión, Forest, para usar repos anidados, que parece ajustarse mejor a tu modelo mental. Elegí Git sobre Mercurial hace 15 meses, pero HG se mantuvo estable y para muchos usos creo que es comparable a Git. No sé qué tan estable es la extensión.

  2. Si estuviera en su situación, usaría dos repositorios Git, uno para el complemento y otro para el proyecto principal. El proveedor haría el desarrollo en el repositorio de complementos y tendría una rama de publicación en la que extraerán las versiones actuales del complemento sin el resto del entorno de desarrollo. Esa rama se incluiría en el repositorio de MainProject como una rama de proveedor y luego se fusionaría con la rama de desarrollo principal. Cuando su equipo trabaja en un cambio en el complemento, lo desarrollan en una rama de funciones fuera de su rama de desarrollo principal y lo envían al repositorio del proveedor como parches. Esto le proporciona un flujo de trabajo muy limpio, relativamente fácil de configurar y aprender, mientras mantiene la historia de desarrollo segregada.

    No intento ser discutidor, sino simplemente decir que Git es el más indicado para comprender tu situación. La forma más fácil de configurar esto sería utilizar la combinación de subárbol, pero esto no se ejecuta a través de él en ambas direcciones, lo que fue mi objeción para usar ese patrón.

  3. Si su equipo está realmente involucrado activamente en el desarrollo del complemento o si realmente desea tener el historial de desarrollo del proyecto y del complemento integrado en un repositorio de Git, entonces simplemente use un repositorio de Git. Puede extraer el complemento y su historial para los registros de su proveedor como se explica aquí , de vez en cuando. Esto puede proporcionarle menos encapsulado de lo que pretende, pero Git no está diseñado para encapsularse: la estructura de datos de Git se basa en el seguimiento de los cambios dentro de un proyecto completo.

Quizás he entendido mal tu situación y nada de esto aplica. Si es así, me disculpo. Gracias por los detalles que usted y VonC han resuelto, que han llenado muchos agujeros que originalmente tuve al tratar de entender su pregunta.


Si busca el título de la pregunta original:

una buena plantilla para el patrón de rama del proveedor con git está en

https://www.roe.ch/Git_Reference

sección Patrón de rama de vendedor