Sistema de control de revisiones con múltiples proyectos similares (uno personalizado para cada cliente de un mismo producto)

Tengo varios proyectos de SW de diferentes clientes con los que estoy implementando el sistema de control de versiones de git y me gustaría saber cuál es la mejor manera de hacerlo. Los proyectos son similares y, en la mayoría de los casos, se derivan de los existentes, pero son únicos para cada cliente. ¿Crearía un repository para cada cliente o crearía nuevas sucursales en su lugar?

No hay forma de que alguien aquí pueda darte la "mejor" manera con tal información limitada.

Como es el caso de muchos otros sistemas de control de versiones distribuidas, la decisión de cómo va a publicar sus proyectos (muchas sucursales en un único repository, o múltiples repositorys con una / pocas bifurcaciones) es en gran parte independiente de la mayor cantidad temas importantes de la administración general de la historia (cómo manejará la historia que registra Git).

Comenzaría concentrándome en determinar qué bits de datos e historial se deben compartir en los proyectos. De cara al futuro, la historia implicará no solo lo que sucedió en el pasado, sino también lo que espera que suceda en el futuro.

Parece que es posible que desee tener un set básico de files que sea común en todos sus proyectos y luego tener algunos files / cambios por proyecto en capas sobre el set básico de files. Como diagtwig de historia, podría verse así:

a1--a2--a3 customer-a / o--o--o base \ b1 customer-b 

En el futuro, podría ser lo suficientemente bueno para hacer cambios en 'base' y simplemente fusionarlos en las sucursales de los clientes:

  a1--a2--a3--a4------a5 customer-a / / / o--o--o--o--o--o--o--o----o base \ \ \ b1----------b2--b3--b4 customer-b 

O bien, tal vez desee "hacer flotar" los cambios específicos del cliente sobre los cambios básicos con algo así como git rebase :

 Rebase customer changes on top of four new base changes: a1--a2--a3 / a1'--a2'--a3' customer-a / / o--o--o--o--o--o--o base \ \ \ b1' customer-b b1 Another change for B, and two more changes in base: a1'--a2'--a3' / / a1''--a2''-a3'' customer-a / / o--o--o--o--o--o--o--o--o base \ \ \ b1''--b2' customer-b \ b1'--b2 

Puede interpretar cada una de las tags anteriores (base, cliente-a, cliente-b) como sucursales, pero podría fácilmente publicar cada una como una sola sucursal en repositorys separados sin pérdida de funcionalidad (aunque es posible que desee desarrollar y testing con un repository en funcionamiento que tiene toda la historia).

Dependiendo de la naturaleza de las instalaciones del proyecto / cliente, es posible que los datos específicos del proyecto ni siquiera tengan que estar relacionados con el código / datos base. Si los proyectos no requieren cambios en los files base (por ejemplo, toda la personalización se realiza en files de configuration que no están presentes en la base), puede mantener un historial lineal simple (twigs) para la configuration de cada proyecto junto con cualquier historial que te gusta (twigs / tags) para los files base. Luego, para cada installation, puede verificar la base y la configuration específica del proyecto y configurarlo en funcionamiento.

Incluso puede optar por mantener la historia de cada proyecto totalmente independiente y simplemente aplicar parches según sea necesario para los diversos proyectos (pero eso realmente equivale a renunciar a la mayor parte de los beneficios de utilizar un poderoso sistema de control de versiones). Todavía podría publicar un set de twigs "no relacionadas" en un único repository (la forma en que publica realmente es independiente de cómo gestiona el historial).

El path que sigas depende de cómo quieras administrar el historial.

  • ¿Quieres agrupaciones agradables y separadas de cambios específicos del cliente en los extremos de la historia?
  • ¿Varias personas tendrán acceso a los repositorys?
    • Volver a escribir el historial (por ejemplo, con rebase) puede ser doloroso para múltiples usuarios, o incluso solo múltiples repositorys de trabajo de un solo usuario.
  • ¿Cuán interrelacionados son los cambios específicos del proyecto y el código / datos base?
  • ¿Algunos proyectos están estrechamente relacionados (comparten la mayoría de los cambios con) otros proyectos?
  • ¿Hay alguna herramienta (StGit, TopGit, Culpabilidad, etc.) que pueda ayudar a administrar el historial por proyecto de una manera conveniente?

Además de la administración pura de historial, también deberá considerar las capacidades de su proveedor de services Git (por ejemplo, GitHub, git.or.cz, una installation personalizada / gitosis / …, etc.). Si tiene varios desarrolladores y desea restringirlos para que trabajen en determinados proyectos / clientes, es posible que tenga que publicar en varios repositorys (si el service de Git que está utilizando no permite los permissions por twig). Pero la gestión de la historia es la mejor parte para hacerlo bien. Siempre puede cambiar la manera en que publica su historial; es mucho más doloroso tener que volver a escribir el historial publicado.

Mi consejo es que lea la mayor cantidad de documentation posible y que tenga sus propias decisiones informadas. El Manual del usuario de Git es un buen lugar para comenzar. Me gustó especialmente Git para Computer Scientists y Git de abajo para entender a Git desde adentro hacia afuera. Tener una comprensión firme de los aspectos internos de Git realmente te ayuda a entender los commands (conceptualmente) simples ( git merge ) y los más complejos ( git cherry-pick , git rebase [-i] ) Git.

Iré por crear nuevas twigs. de esta manera less código repetido. DRY es la regla del pulgar

Podría considerar tener algún tipo de biblioteca que estaría vinculada a ambos proyectos. Y coloque cosas que podrían usarse en más de un proyecto en esa lib. Aparecerán automáticamente en todos los proyectos.

En cuanto a los proyectos en sí mismos tener un solo repos es definitivamente mejor. Mantenga un historial limpio y puede evitar las fusiones en absoluto, simplemente select cuidadosamente las revisiones que necesita de otra twig (que no se puede dividir en la lib).

Así que me quedaría con dos repositorys. Uno para la biblioteca compartida y uno para todos sus proyectos basados ​​en él.

Nota: siempre tendrá "un informe por cliente".
La pregunta es: ¿Cómo se usa ese repository? Si se crea a partir de un repository central único, obtendrá toda la historia de ese repository.

Para elaborar uno, "Si tienes múltiples desarrolladores y quieres restringirlos para trabajar en ciertos proyectos / clientes, es posible que tengas que publicar en varios repositorys" de la respuesta de Chris Johnsen :

Si tiene problemas de confidencialidad entre el cliente, podría considerar:

  • un repository central (que niega cualquier impulso al mismo), que representa la plantilla común
  • un repository clonado por cliente donde se realiza el trabajo (en una sucursal específica del cliente)
  • un repository privado (que niega cualquier extracción) donde puede retrasar el trabajo realizado por el cliente, en varias sucursales.
    Desde ese repository privado, puede:
    • actualizar la parte de la plantilla con algunas mejoras de las sucursales de los clientes
    • exportar parches y aplicarlos en el repository central público.

Los mecanismos de denegación push / pull dependerán de la forma en que usted esté compartiendo / accediendo a su repository central (ya sea a través del proveedor de services público de Git, o mediante una de las 8 forms de compartir sus repositorys ).