Git Submodul Push


128

Wenn ich ein Submodul ändere, kann ich das Commit auf den Ursprung des Submoduls zurückschieben, oder würde dies einen Klon erfordern? Kann ich beim Klonen einen Klon in einem anderen Repository speichern?


4
Mit Git 2.7 (Januar 2016) müssen Sie nur einmal einstellen git config push.recurseSubmodules on-demand. Dann reicht ein einfaches git push, um alles zu pushen (Haupt-Repo und Submodule). Siehe meine bearbeitete Antwort unten .
VonC

Bitte geben Sie einen Beispielcode für das an, was Sie versuchen.
Ciro Santilli 6 冠状 病 六四 事件 6

Antworten:


138

Ein Submodul ist nichts anderes als ein Klon eines Git-Repos innerhalb eines anderen Repos mit einigen zusätzlichen Metadaten (Gitlink-Baumeintrag, Git-Modul-Datei).

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"

1
Ja, und vergessen Sie nicht, vor dem Push Änderungen von Ihrem synchronisierten lokalen Zweig (falls vorhanden) abzurufen. Passiert zB. bei der Arbeit mit einem gh-pagesZweig für die Dokumentation auf einem Github-Repo :)
NiKo

Ich verstehe nicht, wie Sie Ihr Submodul cd können, bevor Sie Ihr Submodul hinzufügen? Ich dachte, der beste Weg, um ein Submodul hinzuzufügen, war die Verwendung des Befehls "add" git. Gibt es also eine andere Möglichkeit, ein Submodul hinzuzufügen?
MrSo

1
@ MrSo Ich denke, das Submodul ist bereits da, er dringt ein, um etwas im Submodul zu ändern.
HattrickNZ

108

Beachten Sie, dass seit git1.7.11 ( [ANNOUNCE] Git 1.7.11.rc1 und Release Note , Juni 2012) Folgendes erwähnt wird:

" git push --recurse-submodules" lernte, optional die Geschichte der an das Superprojekt gebundenen Submodule zu untersuchen und sie herauszuschieben.

Wahrscheinlich nach diesem Patch und der --on-demandOption gemacht:

recurse-submodules=<check|on-demand>::

Stellen Sie sicher, dass alle Submodul-Commits, die von den zu übertragenden Revisionen verwendet werden, in einem Remote-Tracking-Zweig verfügbar sind.

  • Wenn checkverwendet, wird überprüft, ob alle Submodul-Commits, die sich in den zu übertragenden Revisionen geändert haben, auf einer Fernbedienung verfügbar sind.
    Andernfalls wird der Push abgebrochen und mit einem Status ungleich Null beendet.
  • Wenn on-demandverwendet, werden alle Submodule, die sich in den zu pushenden Revisionen geändert haben, gepusht.
    Wenn On-Demand nicht alle erforderlichen Revisionen durchführen konnte, wird es ebenfalls abgebrochen und mit dem Status ungleich Null beendet.

So können Sie alles auf einmal pushen mit (aus dem Eltern-Repo) a:

git push --recurse-submodules=on-demand

Diese Option funktioniert nur für eine Verschachtelungsebene. Änderungen am Submodul innerhalb eines anderen Submoduls werden nicht übernommen.


Mit git 2.7 (Januar 2016) reicht ein einfacher git-Push aus, um das übergeordnete Repo ... und alle seine Submodule zu pushen .

Siehe Commit d34141c , Commit f5c7cd9 (3. Dezember 2015), Commit f5c7cd9 (3. Dezember 2015) und Commit b33a15b (17. November 2015) von Mike Crowe ( mikecrowe) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 5d35d72 , 21. Dezember 2015)

push: recurseSubmodulesKonfigurationsoption hinzufügen

Der --recurse-submodulesBefehlszeilenparameter existiert seit einiger Zeit, hat jedoch keine entsprechende Entsprechung für die Konfigurationsdatei.

git fetchLassen Sie uns nach dem Stil des entsprechenden Parameters für erfinden push.recurseSubmodules, um einen Standard für diesen Parameter bereitzustellen.
Dies erfordert auch das Hinzufügen von --recurse-submodules=no, damit die Konfiguration bei Bedarf in der Befehlszeile überschrieben werden kann.

Der einfachste Weg, dies zu implementieren, scheint darin zu bestehen, pushCode auf submodule-configähnliche Weise wie zu verwenden fetch.

Das git configDokument enthält jetzt :

push.recurseSubmodules::

Stellen Sie sicher, dass alle Submodul-Commits, die von den zu übertragenden Revisionen verwendet werden, in einem Remote-Tracking-Zweig verfügbar sind.

  • Wenn der Wert ' check' ist, überprüft Git, ob alle in den zu übertragenden Revisionen geänderten Commits des Submoduls auf mindestens einer Fernbedienung des Submoduls verfügbar sind. Wenn Commits fehlen, wird der Push abgebrochen und mit einem Status ungleich Null beendet.
  • Wenn der Wert ' on-demand' ist, werden alle Submodule, die sich in den zu pushenden Revisionen geändert haben, gepusht. Wenn On-Demand nicht alle erforderlichen Revisionen durchführen konnte, wird es ebenfalls abgebrochen und mit dem Status ungleich Null beendet. - -
  • Wenn der Wert ' no' ist, wird das Standardverhalten beim Ignorieren von Submodulen beim Drücken beibehalten.

Sie können diese Konfiguration zum Zeitpunkt des Push überschreiben, indem Sie ' --recurse-submodules=check|on-demand|no' angeben .

So:

git config push.recurseSubmodules on-demand
git push

Git 2.12 (Q1 2017)

git push --dry-run --recurse-submodules=on-demand wird tatsächlich funktionieren.

Siehe Commit 0301c82 , Commit 1aa7365 (17. November 2016) von Brandon Williams ( mbrandonw) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 12cf113 , 16. Dezember 2016)

push run with --dry-runführt keinen Trockenlauf durch (Git 2.11 Dez. 2016 und niedriger / vorher), wenn Push so konfiguriert ist, dass Submodule bei Bedarf gepusht werden.
Stattdessen werden alle Submodule, die gepusht werden müssen, tatsächlich auf ihre Fernbedienungen gepusht, während alle Aktualisierungen für das Superprojekt als Trockenlauf ausgeführt werden.
Dies ist ein Fehler und nicht das beabsichtigte Verhalten eines Trockenlaufs.

Lehren Sie push, die --dry-runOption zu respektieren, wenn sie so konfiguriert ist, dass Submodule bei Bedarf rekursiv übertragen werden.
Dies erfolgt durch Übergeben des --dry-runFlags an den untergeordneten Prozess, der bei einem Trockenlauf einen Push für ein Submodul ausführt.


Und immer noch in Git 2.12 haben Sie jetzt die --recurse-submodules=onlyOption , Submodule herauszuschieben, ohne das Superprojekt der obersten Ebene zu verschieben .

Siehe Commit 225e8bf , Commit 6c656c3 , Commit 14c01bd (19. Dezember 2016) von Brandon Williams ( mbrandonw) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 792e22e , 31. Januar 2017)


Das ist jetzt verfügbar, nicht wahr?
CMCDragonkai

@CMCDragonkai Ja, das ist es, Sie können es in git-scm.com/docs/git-push sehen . Ich habe die Antwort bearbeitet.
VonC

Gibt es ein rekursives Commit?
CMCDragonkai

1
Sie können immer "Git-Submodul für jedes Commit"
ausführen

Ich musste meine .gitmodules-Datei mit den Bitbucket-URLs aktualisieren.
wclark
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.