Verkäufer Branches in Git

Ein Git-Projekt enthält ein zweites Projekt, dessen Inhalt selbstständig bearbeitet wird.

Submodule können nicht für die kleineren verwendet werden, da auch das Unterprojekt einbezogen werden muss, wenn Benutzer versuchen, den “Eltern” zu klonen oder herunterzuladen.

Das Subtree-Merging kann nicht verwendet werden, da das Subprojekt aktiv entwickelt wird und das Subtree-Merging es sehr schwierig macht, diese Updates wieder in das ursprüngliche Projekt zusammenzuführen.

Ich wurde informiert, dass die Lösung in der SVN-Welt als “Vendor Branches” bekannt ist, und dass es in Git so einfach gemacht wird, um nicht einmal Adressierung zu benötigen. Halbgebackene Tutorials gibt es im Netz.

Trotzdem kann ich es nicht zur Arbeit bringen.

Kann jemand bitte (hübsch bitte?) Erklären, wie ich eine Struktur schaffen kann, in der ein Projekt innerhalb eines anderen existiert, und beide aus demselben Arbeitsverzeichnis entwickelt und aktualisiert werden können. Im Idealfall [oder besser: wenn es nicht unterstützt wird] ist es wichtig, dass ein Client, der versucht, das Elternprojekt herunterzuladen, automatisch die neueste Version des Unterprojekts erhält.

Bitte erklären Sie mir NICHT, wie ich Submodule oder Subtree-Merges oder gar SVN: Externals verwenden soll. Dieser Thread ist das Auswuchs des folgenden SO-Threads , und wenn etwas dort verpasst wurde, poste es bitte dort . Dieser Thread versucht, ein Verständnis davon zu bekommen, wie man Zweige verzweigt, und je länger, klarer und bedauerlicher eine Erklärung, die ich empfange, desto glücklicher werde ich sein.

Ich denke Submodule sind der Weg zu gehen, wenn es um “Vendor Branch” geht.
Hier ist, wie Sie submod verwenden sollten … hmmm, nur Spaß.

Nur ein Gedanke; Sie wollen:

  • Entwicklung von Hauptprojekt und Unterprojekt innerhalb desselben Verzeichnisses (was als ” Systemansatz ” bezeichnet wird: Sie entwickeln, markieren und merge das gesamte System)
  • oder um Ihr Unterprojekt als “Lieferantenzweig” anzusehen (eine Verzweigung, mit der Sie auf eine gut definierte Version einer externen Komponente eines Anbieters – oder “Menge von Dateien” – zugreifen können und die nur mit dem neuen aktualisiert wird Version jeder Version dieser externen Komponente: Dies wird als ” Komponenten-Ansatz ” bezeichnet, das gesamte System wird als eine Sammlung separater Komponenten angesehen, die für sich allein entwickelt wurden.

Die beiden Ansätze sind nicht kompatibel:

  • Die erste Strategie ist mit einer Teilbaumzusammenführung kompatibel: Sie arbeiten sowohl an einem Projekt als auch an einem Teilprojekt.
  • Die zweite wird mit Submodulen verwendet, aber Submodule werden verwendet, um eine Konfiguration zu definieren (Liste der Tags, die Sie arbeiten müssen): Jedes Git-Submodul wird im Gegensatz zu svn: externals an eine bestimmte Commit-ID angeheftet, und das ist es, was Ihnen erlaubt Definieren Sie eine Konfiguration (wie in S C M: “Softwarekonfigurationsmanagement”)

Ich mag den zweiten Ansatz, weil die meiste Zeit, wenn Sie ein Projekt und ein Teilprojekt haben, ihr Lebenszyklus anders ist (sie sind nicht im selben Rhythmus entwickelt, nicht gleichzeitig mit demselben Namen oder mit demselben Namen versehen) .

Was diesen Ansatz (“komponentenbasiert”) in Ihrer Frage wirklich verhindert, ist der Teil “beide können aus demselben Arbeitsverzeichnis entwickelt und aktualisiert werden”.
Ich möchte Sie wirklich dazu auffordern, diese Anforderung zu überdenken, da die meisten IDEs perfekt in der Lage sind, mit mehreren Quellenverzeichnissen zu arbeiten, und die Entwicklung des Unterprojekts kann in einer eigenen dedizierten Umgebung erfolgen.


samgoody fügt hinzu:

Stellen Sie sich ein eMap-Plugin für Joomla und ModX vor. Sowohl das Plugin als auch der Joomla-spezifische Code (der Teil von Joomla ist, nicht von eMap) werden entwickelt, während sich das Plugin in Joomla befindet. Alle Pfade sind relativ, die Struktur ist starr und sie müssen zusammen verteilt werden – obwohl jedes Projekt seinen eigenen Lebenszyklus hat.

Wenn ich das richtig verstanden habe, befinden Sie sich in einer Konfiguration, in der die Entwicklungsumgebung (der Satz von Dateien, an denen Sie gerade arbeiten) mit der Verteilungsumgebung identisch ist (derselbe Satz von Dateien wird auf die Release-Plattform kopiert).

Es kommt alles zu einem Granularitätsproblem:

  • Wenn beide Dateigruppen nicht ohne die andere existieren können, sollten sie als ein großes Projekt (und als Teilbaum) betrachtet werden, aber das zwingt sie, markiert und als eins zusammengeführt zu werden. -wenn man vom anderen abhängig ist (was alleine entwickelt werden kann), dann sollten sie in ihrem eigenen Git Repository und Projekt sein, wobei das erste von einem spezifischen Commit des zweiten als Sub-Modul abhängt: wenn das Sub-Modul ist definiert im rechten Teilbaum der ersten Komponente, werden alle relativen Pfade berücksichtigt.

samgoody fügt hinzu:

Der ursprüngliche Thread hat Probleme mit Submodulen aufgelistet – hauptsächlich, dass der Download von GitHub sie nicht enthält (wichtig für mich) und dass sie bei einem bestimmten Commit hängen bleiben.

Ich bin mir nicht sicher, dass GitHubs Download in letzter Zeit ein Problem ist: Der Artikel ” Anleitungen: Entwickeln mit Submodulen ” erwähnt Folgendes:

Das Beste von allem: Leute, die Ihr my-awesome-framework fork klonen, werden kein Problem haben, Ihr my-fantastic-plugin Submodul herunterzuziehen, da Sie die öffentliche Klon-URL für das Submodul registriert haben. Die Befehle

 $ gh submodule init $ gh submodule update 

Wird die Submodule in das aktuelle Repository ziehen.

Wie für die “sie stecken bei einem bestimmten Commit”: das ist der einzige Punkt eines Submoduls, so dass Sie mit einer Konfiguration (Liste der markierten Version der Komponenten) anstelle einer letzten potenziell instabilen Gruppe von Dateien arbeiten können.

samgoody erwähnt:

Ich muss sowohl Teilbäume als auch Submodule vermeiden (siehe Frage) und würde dieses Bedürfnis eher angehen, ohne zu viel zu streiten, wenn der Ansatz gerechtfertigt ist

Ihre Anforderung ist eine vollkommen legitime und ich möchte ihre Rechtfertigung nicht beurteilen: Meine vorherigen Antworten dienen nur dazu, einen größeren Kontext zu liefern und zu versuchen, die Optionen zu veranschaulichen, die normalerweise mit einem allgemeinen SCM-Tool verfügbar sind.

Die Subtree-Zusammenführung sollte hier die Antwort sein, würde aber bedeuten, nur Commits für Dateien für das Hauptprojekt zusammenzuführen und keine Commits für die Subprojekte. Wenn Sie diese Art der partiellen Zusammenführung verwalten können, würde ich denken, dass es der richtige Weg ist, um zu folgen.

Ich sehe jedoch keine native Git-Methode, um das zu tun, was du willst, das Sub-Baum-Merge oder Submodul nicht verwendet.
Ich hoffe, dass ein echter Git-Guru hier eine adäquatere Antwort schreiben wird.

Ich habe endlich ein paar Stunden Zugang zum Netz, bevor ich zurück in die Berge gehe. Wir werden sehen, ob ich irgendetwas beitragen kann, um Klarheit in Ihre Situation zu bringen.

Mein (wahrscheinlich zu stark vereinfachtes) Verständnis besteht darin, dass Sie (externe) Anbieter Plug-ins für Ihr Projekt entwickeln, in denen Ihr (Inhouse-) Team Code für Ihr Hauptprojekt mithilfe eines externen Framework entwickelt. Der Anbieter nimmt keine Änderungen an Ihrem Code vor und benötigt wahrscheinlich nicht Ihre neueste Entwicklung, sondern benötigt Ihren stabilen Code, um seine Arbeit zu entwickeln und zu testen. Ihr Team nimmt keine Änderungen am Framework vor, trägt jedoch manchmal zu Änderungen am Plug-in bei.

  1. Wie VonC (der normalerweise Dinge sehr gründlich durchdenkt) glaube ich nicht, dass Git perfekt zu Ihren Anforderungen passt. Und wie er denke ich, dass die Verwendung von Teilbaum-Merge-Pattern am besten passt. Ich bin kein Git-Guru, aber ich war erfolgreich darin, Git auf eine große Bandbreite von Bedürfnissen einzustellen. Vielleicht erfüllt Git Ihre Bedürfnisse nicht:

    • SVN wird Ihnen mehrere Repos innerhalb eines geben, was Ihnen wichtig erscheint. Ich denke, das würde bedeuten, entweder externe oder das Muster der Zweigstelle zu verwenden, um dem zu kommen, was Sie wollen.

    • Mercurial hat eine Erweiterung, Forest, um verschachtelte Repos zu verwenden, die besser zu Ihrem mentalen Modell passen. Ich wählte Git vor Mercurial vor 15 Monaten, aber HG war stabil und für viele Anwendungen denke ich, dass es mit Git vergleichbar ist. Ich weiß nicht, wie stabil die Erweiterung ist.

  2. Wenn ich in Ihrer Situation wäre, würde ich zwei Git-Repos verwenden – eines für das Plugin und eines für das MainProject. Der Hersteller würde die Entwicklung im Plugin-Repo durchführen und würde einen Release-Zweig haben, in den er aktuelle Versionen des Plug-ins ohne den Rest der Entwicklungsumgebung zieht. Dieser Zweig würde als Händlerzweig in das MainProject-Repo gezogen und dann in Ihren Hauptentwicklungszweig zusammengeführt. Wenn Ihr Team daran arbeitet, das Plug-in zu ändern, wird es in einer Feature-Verzweigung Ihres Hauptentwicklungszweiges entwickelt und als Patch an den Lieferantenrepo gesendet. Dies gibt Ihnen einen sehr sauberen Arbeitsablauf, relativ einfach einzurichten und zu lernen, während die Entwicklungsgeschichte getrennt bleibt.

    Ich versuche nicht streitsüchtig zu sein, sondern einfach zu sagen, dass Git am besten zu meinem Verständnis Ihrer Situation passt. Der einfachste Weg, dies einzurichten, wäre die Teilbaumzusammenführung, aber es werden keine Änderungen in beide Richtungen durchgeführt, was mein Einwand gegen die Verwendung dieses Musters war.

  3. Wenn Ihr Team wirklich aktiv an der Entwicklung des Plugins beteiligt ist oder Sie wirklich die Entwicklungsgeschichte von Projekt und Plug-in in einem Git Repo integrieren möchten, dann verwenden Sie einfach ein Git Repo. Sie können das Plug-In und seinen Verlauf für die Datensätze Ihres Anbieters, wie hier erläutert , von Zeit zu Zeit extrahieren. Dies kann zu weniger Verkapselung führen, als Sie beabsichtigen, aber Git ist nicht für die Verkapselung konzipiert – die Datenstruktur von Git basiert auf der Verfolgung von Änderungen innerhalb eines ganzen Projekts.

Vielleicht habe ich deine Situation missverstanden und nichts davon gilt. Wenn das so ist, entschuldige ich mich. Danke für die Details, die Sie und VonC erarbeitet haben, die viele Lücken gefüllt haben, die ich ursprünglich hatte, als ich versuchte, Ihre Frage zu verstehen.

Wenn Sie nur nach dem Titel der ursprünglichen Frage suchen:

Eine gute Vorlage für das Lieferantenzweigmuster mit Git ist aktiviert

https://www.roe.ch/Git_Reference

Abschnitt Zweigmuster des Lieferanten