2017-10-18 1 views
0

Ich möchte die Idee von Monorepo innerhalb meiner Firma zu fördern.
Ich würde planen, sie auf diese Weise zu verwenden:Git Submodul Spur Zweig wirksam

Ich habe einen ‚Eltern‘ Repo hält ein Submodul für jede Komponenten unseres Stapel, damit die Aufrechterhaltung einer globalen Versionierung für den gesamten Stapel (wir können einfach Überprüfen Sie alle Komponenten in einem bestimmten Zweig)

Das klingt perfekt, weil wir immer noch von jedem CI-Service aus der Box profitieren können (haben wir noch auf unabhängige Git Repo, die Submodule schieben).

Die einzige (schrecklich) Schwäche bei diesem Ansatz ist, dass ein, wenn eine der folgenden Config

git submodule update --remote 

tun:

[submodule "commonLib"] 
    path = commonLib 
    url = [email protected]:org/commonLib.git 
    branch = MY_BRANCH 

Jedes Modul wird effektiv an der rechten geoutet Scheck begehen .

Aber: Sie sind alle in freistehendem Leiter

Warum gibt es keine Möglichkeit, um effektiv gitsumodule mit Zweig zu verwenden. d. H: bei der Aktualisierung die Verzweigung und nicht die von dieser Verzweigung angegebene Festschreibung effektiv auschecken? Gibt es einen technischen Grund oder einfach nicht in Git implementiert?

Dank

+0

Wir stießen auf das gleiche Problem. Das Problem besteht darin, dass das Master-Repository jedes Mal, wenn ein Submodul aktualisiert wird, Submodule aktualisieren muss, um den Master-Zweig auf den neuesten Stand zu bringen. Am Ende haben wir die Kernprojekte in einem einzigen Repo zusammengefasst, der das Problem gelöst hat. Submodule funktionieren am besten für Abhängigkeiten von Drittanbietern und andere private Projekte, die sich nicht oft ändern. Im Idealfall sollte jedes Submodul unabhängig aufgebaut werden, so dass es selbst in CI laufen kann. Sie können Google Git-Repo, die dieses Problem teilweise behandelt. https://gerrit.googlesource.com/git-repo/ –

+0

Können Sie näher auf das Problem eingehen, über das Sie sprechen, ich bin mir nicht sicher, ob Sie es richtig verstehen. – Clement

+0

Von dem, was ich verstehe, wenn Sie die Verzweigungsverfolgung verwenden, zeigt das ausgecheckte Submodul direkt auf die richtige Festschreibung, aber nicht auf die Verzweigung, die auf diese Festschreibung zeigt. Was bedeutet, dass sich jeder vor dem Arbeiten um den richtigen Zweig kümmern muss ... Und das, was mich stört. – Clement

Antwort

1

Ein Teil der Antwort ist, dass git Submodule eine konsistente/kohärente Ansicht eines Satzes von mehreren Repositories ermöglichen sollen. Und die einzige Möglichkeit, dies zu erreichen, besteht darin, jedes Submodul in einer bestimmten Version zu sperren, wobei das Parser-Repo alle Versionen für alle Submodule verfolgt, wodurch das Gesamtprojekt das Aussehen eines Monorepos erhält.

Wenn man in einem solchen Projektkontext arbeitet, macht es wenig Sinn, ein bestimmtes Submodul nur auf einer Verzweigungsebene anzugeben, weil das eine Version aufnehmen kann, die nicht mit dem Rest des Projekts konsistent ist.

Ein anderer Teil der Antwort ist nicht spezifisch für das Git-Submodul, sondern für ein beliebiges Git-Repo: Wenn eine bestimmte Version gezogen wird, befindet sich das Repo im gelösten Kopfzustand. Mit nicht viel Unterstützung für Branchenidentifikation, weil in git Niederlassungen nicht die gleiche Bedeutung und Bedeutung wie in anderen Versionskontrollsystemen haben, finden Sie in dieser ausgezeichneten Antwort für Details: https://stackoverflow.com/a/3162929/4495081.

Ich sehe zwei Möglichkeiten, das Risiko menschlicher Fehler verringert wird, wenn die rechten Zweig bei Updates Kommissionierung:

  • Verwendung konsistente Zweig Namen in allen Repositories und Etiketten/Tags (im Idealfall von Ihrem CI erzeugt/CD-System), deren Verzweigungsname in ihrer Kennung codiert ist. Ein ziemlich schwieriger Verkauf am Anfang, bei dem jedes Komponenten-besitzende Team die volle Entscheidungskraft hat, aber es kann besser werden, wenn die Teams schließlich verstehen, dass sie tatsächlich eine Ausrichtung benötigen, um ein zusammenhängendes Produkt zu bilden.

  • bieten Automation Wrapper auf Projektebene für den Betrieb in den Repositorys, die die richtigen Zweiginformationen aus dem übergeordneten Repo extrahieren (während auch Plausibilitätsprüfungen und/oder damit verbundene Vorgänge zur Aufrechterhaltung des Arbeitsbereichs des Entwicklers und der Projektkonsistenz).