Vendedor de sucursales en Git

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

Los submodules no se pueden usar para los más pequeños, ya que incluso el subproyecto debe includese cuando los usuarios intentan clonar o download el 'padre'.

La combinación de subtreees no se puede utilizar, ya que el subproyecto se está desarrollando activamente, y la fusión de subtreees 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 networking.

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 directory de trabajo. Idealmente [o más bien: es bastante importante, si no se admite] que cuando un cliente intenta download 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 submodules o combinaciones de subtreees o incluso SVN: Externos. Este subprocess es la consecuencia del siguiente subprocess SO , y si se omitió algo allí, publíquelo allí . Este hilo trata de comprender cómo vender twigs, y cuanto más larga, clara y dummida sea la explicación que reciba, más feliz seré.

Creo que los submodules son el path a seguir cuando se trata de "twig 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 directory (lo que se llama un " enfoque de sistema ": usted desarrolla, label y combina todo el sistema)
  • o para ver su subproyecto como una "twig de proveedor" (que es una twig que le permite acceder a una versión bien definida de un componente externo del proveedor, o "set de files", y que solo se actualiza con el nuevo versione cada versión de ese componente externo: se denomina " enfoque por componentes ", el sistema completo se ve como una colección de componentes independientes desarrollados por sí mismos)

Los dos enfoques no son compatibles:

  • La primera estrategia es compatible con una combinación de subtree: está trabajando tanto en el proyecto como en el subproyecto.
  • El segundo se usa con submodules, pero los submodules se usan para definir una configuration (list de tags que necesita para trabajar): cada submodule 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 configuration (como en S C M: "gestión de configuration 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 labeln al mismo time, 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 directory 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 directorys de "fonts", 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 routes 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 configuration donde el entorno de desarrollo (el set de files en el que está trabajando) es bastante similar al entorno de distribución (el mismo set de files se copy en la plataforma de lanzamiento)

Todo viene hecho a un problema de granularidad:

  • si ambos sets de files no pueden existir uno sin el otro, entonces deberían verse como un gran proyecto (y un subtree-fusionados), pero eso los fuerza a ser labeldos y fusionados como uno solo. -si uno depende del otro (que puede desarrollarse solo), entonces deberían estar en su propio repository y proyecto Git, el primero dependiendo de un compromiso específico del segundo como un submodule: si el submodule es definido en el subtree derecho del primer componente, se respetan todas las routes relativas.

samgoody agrega:

El hilo original enumeraba los problemas con los submodules, 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 submodules " menciona:

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

 $ gh submodule init $ gh submodule update 

Jalará los submodules en el repository actual.

En cuanto a "se quedan atascados en un compromiso en particular": ese es el punto central de un submodule, que le permite trabajar con una configuration (list de versiones labeldas de componentes) en lugar de un último set de files potencialmente inestable.

samgoody menciona:

Necesito evitar tanto los subtreees como los submodules (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 context más amplio y tratar de ilustrar las opciones generalmente disponibles con una herramienta SCM genérica.

La fusión de subtreees debería ser la respuesta aquí, pero implicaría fusionar solo los commit realizados para los files del proyecto principal, y no los commits realizados para los subproyectos. Si puede administrar ese tipo de fusión parcial, creo que es el path 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.

Finalmente tengo unas horas de acceso a la networking 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 background), no creo que Git se ajuste perfectamente a tus necesidades. Y, como él, creo que usar el patrón de combinación de subtree 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 repositorys 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 nesteds, que parece ajustarse mejor a tu model mental. Elegí Git sobre Mercurial hace 15 meses, pero HG fue 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 repositorys Git, uno para el complemento y otro para el proyecto principal. El proveedor haría el desarrollo en el repository de complementos y tendría una twig de publicación en la que extraerán las versiones actuales del complemento sin el rest del entorno de desarrollo. Esa twig se includeía en el repository de MainProject como una twig de proveedor y luego se fusionaría con la twig de desarrollo principal. Cuando su equipo trabaja en un cambio en el complemento, lo desarrollan en una twig de funciones fuera de su twig de desarrollo principal y lo envían al repository 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 bash 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 subtree, 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 repository de Git, entonces simplemente use un repository de Git. Puede extraer el complemento y su historial para los loggings de su proveedor como se explica aquí , de vez en cuando. Esto puede proporcionarle less 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.