Warum erfolgt die Aktualisierung des Git-Submoduls beim Auschecken nicht automatisch?

75

Wenn Sie Zweige mit Git Checkout wechseln, würde ich davon ausgehen, dass Sie die meiste Zeit Ihre Submodule aktualisieren möchten.

  • In welcher Situation möchten Sie Submodule nach dem Wechsel nicht aktualisieren?
  • Was würde kaputt gehen, wenn dies automatisch durch Git Checkout gemacht würde?

Mit Beispiel aktualisiert:

  • Zweig A hat das Submodul S bei 3852f1
  • Zweig B hat das Submodul S bei fd72d7

In Zweig A führt Git Checkout B zu einer Arbeitskopie von Zweig B mit dem Submodul S bei 3852f1 (mit einem modifizierten S). Das Git-Submodul-Update wird S bei fd72d7 auschecken.

serbaut
quelle
4
Siehe auch
philfreo
2
Ich stimme dir zu. Ich arbeite mit einem Projekt mit Submodulen und nach jedem Pull sollte ich das Git-Submodul-Update ausführen, aber es ist meistens nicht notwendig. Einziger Grund dafür ist, nicht zu verpassen, wenn eines der Submodule tatsächlich aktualisiert wurde.
Evgen Bodunov

Antworten:

25

Ich glaube, dass die Submodule, die nicht automatisch aktualisiert werden, den Entwicklungszielen von Git entsprechen. Git soll in einem verteilten Modus arbeiten und setzt nicht voraus, dass Sie überhaupt eine Verbindung zu einem nicht lokalen Repository herstellen können, es sei denn, Sie weisen dies ausdrücklich an. Wenn ein Submodul nicht automatisch aktualisiert wird, ist dies das erwartete Verhalten, wenn man es so betrachtet.

Wenn Sie jedoch wissen, dass diese Submodule immer eingezogen werden sollen und Sie wissen, dass Sie diese Submodule niemals in ein anderes lokales Repository verzweigen würden, sollte dies nichts beschädigen, wenn Sie sie anschließend automatisch aktualisieren eine Kasse.

Aaron
quelle
49
Ich denke, Git Checkout sollte sich nur beschweren, wenn das Commit für ein Submodul nicht verfügbar war, anstatt das Arbeitsverzeichnis standardmäßig in einem inkonsistenten Zustand zu belassen. Dann können Sie ein Git-Submodul-Update durchführen, um das referenzierte Commit abzurufen. Normalerweise ist das Commit wieder verfügbar und das Auschecken kann ohne Netzwerkzugriff erfolgen. Akzeptiere deine Antwort, da es vernünftig klingt (aber ich mag es nicht;)
serbaut
2
Ich stimme der Vorstellung zu, dass git versuchen sollte, ein Submodul zu initiieren und beim ersten Auschecken zu aktualisieren und sich zu beschweren und im Status anzuzeigen, wenn ein Submodul existiert, das beim ersten Mal nicht lokal gezogen wurde. Nachdem Sie es einmal haben, ist der Gedanke, explizit aktualisieren zu müssen, sinnvoll, da die Repos unterschiedlich sind und das Submodul auf ein bestimmtes Commit verweist. Aber selbst in einer verteilten Welt, in der es möglicherweise nicht verfügbar war, werden Sie es höchstwahrscheinlich irgendwann wollen, und Git sollte Sie wissen lassen, dass es nie gezogen wurde.
Clark
6
git fetchhat eine Option zum automatischen Abrufen von Submodulen, daher denke ich auch, dass das Auschecken eine ähnliche Option zum automatischen Aktualisieren / Auschecken von Submodulen haben sollte.
void.pointer
3
"Wenn ein Submodul nicht automatisch aktualisiert wird, ist dies das erwartete Verhalten, wenn man es so betrachtet." - Ich verstehe nicht warum. In der Tat sehe ich nicht, wie einer der Punkte in Ihrem ersten Absatz für die Frage relevant ist, ob Git beim Ziehen automatisch versuchen sollte, Submodule zu aktualisieren.
Mark Amery
2
Git geht nicht davon aus, dass Sie jederzeit Zugriff auf das Repository haben, aus dem Sie ausgecheckt haben, wenn Sie Arbeiten am Repository ausführen möchten. Stattdessen kann Ihr Repository nach dem Klonen vollständig eigenständig agieren. Wenn die Ausgangsannahme ist, dass Sie nur dann eine Verbindung zu fremden Repositorys herstellen, wenn Sie dazu aufgefordert werden, fällt heraus, dass Git ein Submodul nicht automatisch aktualisieren sollte, was ich zu vermitteln versuchte.
Aaron
33

git checkout --recurse-submodules wurde zu git 2.13 hinzugefügt

Dies wird in den Versionshinweisen unter https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139 erwähnt

submodule.recurse Option wurde zu Git 2.14 hinzugefügt

Festlegen als:

git config --global submodule.recurse true

man git-config sagt:

Gibt an, ob Befehle standardmäßig in Submodule umgewandelt werden. Dies gilt für alle Befehle, die eine --recurse-submodulesOption haben. Der Standardwert ist false.

Ich bin der Meinung, dass das Nicht-Aktualisieren von Modulen standardmäßig ein schlechtes Git-Standardverhalten ist, das den Erwartungen der meisten Benutzer widerspricht und die Einführung von Submodulen einschränkt. Ich wünschte wirklich, die Entwickler würden es ändern.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
2
submodule.recursescheint ab git 2.14 zu funktionieren.
Kane
2
Ich habe mich submodule.recurseeingestellt true, aber ich finde, es gibt immer noch Zeiten (hin und her springen über das Hinzufügen eines Submoduls, denke ich?), In denen ich git submodule update --init --recursivenach meinem tun muss git checkout. Gibt es eine Möglichkeit, dies automatisch zu erreichen?
Ben
2

Mit Git 2.27 (Q2 2020) ist die --recurse-submodulesOption " " besser dokumentiert.

Siehe Commit acbfae3 , Commit 4da9e99 , Commit d09bc51 , Commit b3cec57 , Commit dd0cb7d (06. April 2020) von Damien Robert ( damiens-robert) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit cc908db , 28. April 2020)

doc: --recurse-submodulesGilt hauptsächlich für aktive Submodule

Unterzeichnet von: Damien Robert
Unterstützt von: Philippe Blain

Die Dokumentation bezieht sich auf "initialisierte" oder "aufgefüllte" Submodule, um zu erklären, welche Submodule von " --recurse-submodules" betroffen sind , aber die eigentliche Terminologie hier ist active"Submodule". Aktualisieren Sie die Dokumentation entsprechend.

Einige Begriffe:

  • Active ist in gitsubmodules (7) definiert und beinhaltet nur die Konfigurationsvariablen 'submodule.active', 'submodule.<name>.active' und 'submodule.<name>.url'.
    Die Funktionsubmodule.c::is_submodule_activeprüft, ob ein Submodul aktiv ist.
  • Bevölkerten bedeutet , dass das Submodul des Arbeitsbaum vorhanden ist (und die gitfile korrekt zeigt auf das Submodul Repository), dh entweder die Superproject mit geklont wurde --recurse-submodules, oder der Benutzer RAN git submodule update --initoder git submodule init [<path>]und git submodule update [<path>]getrennt , die das Submodul Arbeitsbaum besiedelt.
    Dies betrifft nicht die 3 oben genannten Konfigurationsvariablen.
  • Initialisiert (zumindest im Kontext der an diesem Patch beteiligten Manpages) bedeutet sowohl "[ gefüllt " als auch "aktiv", wie oben definiert, dh was das Git-Submodul-Update --init ](https://git-scm.com/docs/git-submodule)tut.

Die --recurse-submodulesOption betrifft hauptsächlich aktive Submodule.

Eine Ausnahme ist, git fetchwenn die Option bestückte Submodule betrifft.
Infolgedessen git pull --recurse-submoduleswirkt sich der Abruf auf ausgefüllte Submodule aus, die resultierende Arbeitsbaumaktualisierung wirkt sich jedoch nur auf aktive Submodule aus.

In der Dokumentation von git-pullunterscheiden wir zwischen dem Abrufteil, der sich auf bestückte Submodule auswirkt, und der Aktualisierung von Arbeitsbäumen, die nur aktive Submodule betrifft.

VonC
quelle