Ich werde bald damit beginnen, eine Produktlinie zu unterhalten, die Varianten der gleichen eingebetteten Software enthält. Da ich seit einem Jahr mit Git spiele und es sehr schätze, werde ich es wahrscheinlich für die Quellcodeverwaltung verwenden.Überblick über die Quellcode-Varianten
Es gibt mehrere Optionen, die ich für die Wartung der Varianten der Firmware sehen kann, aber keine erfreut mich zu sehr. Was sind die Best Practices, die Sie für Ihre eigene Arbeit anwenden?
Alternativen ich denken kann:
definiert. Vorverarbeitung. Pros: alles ist immer im Quellcode vorhanden, es ist schwieriger, das Update eines der Produkte zu verpassen. Nachteile: schwerer zu lesen. Es kann in Ordnung sein, während wir nur zwei Varianten haben, wenn es vier oder mehr wird, wird es ein Schmerz sein. Außerdem scheint es schwieriger zu sein, das DRY-Prinzip anzuwenden (Do not Repeat Yourself).
ein Zweig pro Produktvariante. Wenn Änderungen, die für alle Produkte gelten, enthalten sind, muss die Änderung mit den anderen Produkten zusammengeführt werden. Nachteile: Wenn ein Commit sowohl Änderungen für alle Produkte als auch Änderungen für die spezifische Variante enthält, wird es Probleme geben. Natürlich können Sie sicherstellen, dass ein Commit nur eine Art von Änderung enthält: This-Product-Changes oder The-Whole-Family-Changes. Aber versuchen Sie das in einem Team zu erzwingen ?? Außerdem würde das Zusammenführen nicht funktionieren, stattdessen sollten wir Rosinen pflücken. Recht?
ein Kern-Repository als Submodul. Machen Sie alle Dateien, die die Kernfunktionalität enthalten, zu einem eigenständigen Repository. Alle Produkte enthalten eine Version des Kernrepositorys als Untermodul. Nachteile: Ich kann nicht sehen, dass es schließlich keine Varianten des Kern-Submoduls geben würde. Dann sind wir wieder in Schwierigkeiten, und dann benutzen wir wieder defines oder etwas Schlechtes. Ein zentrales Repository mit Niederlassungen? Dann kehren wir zur vorherigen Alternative zurück: Eine Änderung, die für alle Zweige gilt, muss zusammengeführt werden, aber die Zusammenführung umfasst auch die produktspezifischen Elemente.
Erstellen Sie ein Repository pro Modul. Zum Beispiel ein Repository für einen Display-Treiber, ein anderes für die Power-Management-Hardware, noch ein weiteres für die Benutzerschnittstelle, ... Pros: gute Modularität. Machen Sie ein neues Produkt, indem Sie einfach die benötigten Module als Submodule aufnehmen! Alle Submodule können Verzweigungen aufweisen, wenn beispielsweise eine Variante die Hardware auf andere Weise verwendet. Nachteile: Viele und viele Module, die jeweils ein paar Dateien (eine Include-Datei und eine Quelldatei) verfolgen. Ein Streit. Jemand macht ein wichtiges Update in einem Modul? Dann muss jemand die Änderung gegebenenfalls in die anderen Zweige dieses Moduls aufnehmen. Dann muss auch jemand das Submodul in jedem Produkt-Repository aktualisieren. Ziemlich etwas Arbeit, und wir verlieren irgendwie die Schnappschuss-Seite von Git.
Wie machen Sie es, und wie hat es funktioniert? Oder wie würdest du es tun?
Ich habe das Gefühl, dass ich mit Rosinenpicken erfahren sollte.
Mit einer Verzweigung pro Produktlösung können Sie immer eine Entwicklung in einer oder mehreren Verzweigungen durchführen und diese Verzweigung dann in Verzweigungen für Varianten (pro Produkte) zusammenführen. –