Pronto empiezo a mantener una línea de productos que contienen variantes del mismo software integrado. Como he estado jugando con git por un año y lo aprecio mucho, es probable que lo use para el control de la fuente.Llevando un registro de las variantes del código fuente
Hay varias opciones que puedo ver para mantener las variantes del firmware, pero ninguna me agrada demasiado. ¿Cuáles son las mejores prácticas que aplica para su propio trabajo?
alternativas que se me ocurren:
define. Preprocesamiento. Ventajas: todo está siempre presente en el código fuente, es más difícil perderse la actualización de uno de los productos. Contras: más difícil de leer. Podría estar bien si solo tenemos dos variantes, cuando se convierta en cuatro o más será un dolor. Además, parece más difícil aplicar el principio DRY (No repetir).
una rama por variante de producto. Cuando se incluyen cambios que se aplican a todos los productos, el cambio debe fusionarse con los demás productos. Contras: si una confirmación contiene tanto cambios para todos los productos como cambios para la variante específica, habrá problemas. Por supuesto, puede asegurarse de que una confirmación contenga solo un tipo de cambio: este producto cambia o toda la familia cambia. ¿Pero intenta forzar eso en un equipo? Además, la fusión no funcionaría; en su lugar, deberíamos ser selectivos. ¿Derecha?
a core repository como un submódulo. Haga que todos los archivos que contienen la funcionalidad principal sean un repositorio en sí mismo. Todos los productos contienen una versión del repositorio central como un submódulo. Contras: No puedo ver que finalmente no habrá variantes del submódulo central. Entonces estamos en problemas otra vez, y luego usaríamos define o algo malo otra vez. ¿Un repositorio central con ramas? Luego volvemos a la alternativa anterior: un cambio que se aplica a todas las sucursales debe fusionarse, pero la fusión también incluye las cosas específicas del producto.
crear un repositorio por módulo. Por ejemplo, un repositorio para un controlador de pantalla, otro para el hardware de administración de energía, y otro para la interfaz de entrada del usuario, ... Pros: buena modularidad. ¡Crea un nuevo producto simplemente seleccionando los módulos que necesitas como submódulos! Todos los submódulos pueden tener ramas, si por ejemplo una variante usa el hardware de una manera diferente. Contras: Montones y montones de módulos, cada uno haciendo un seguimiento de un par de archivos (un archivo de inclusión y un archivo fuente). Una molestia. ¿Alguien hace una actualización importante en algún módulo? Luego, alguien debe incluir el cambio en las otras ramas de este módulo, si corresponde. Entonces alguien también debe actualizar el submódulo en cada repositorio de productos. Mucho trabajo, y nos gusta perder el lado de la instantánea de git.
¿Cómo lo hace, y cómo ha estado funcionando? ¿O cómo lo harías?
Tengo la sensación de que debería tener experiencia con la cosecha de cerezas.
Con una solución de rama por producto, siempre puede realizar un desarrollo en una rama (s) swperate, y luego fusionar esta rama en ramas de variantes (por productos). –