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?
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?
Antworten:
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"
gh-pagesZweig für die Dokumentation auf einem Github-Repo :)
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ügenDer
--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 erfindenpush.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 aufsubmodule-configähnliche Weise wie zu verwendenfetch.
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)
git config push.recurseSubmodules on-demand. Dann reicht ein einfachesgit push, um alles zu pushen (Haupt-Repo und Submodule). Siehe meine bearbeitete Antwort unten .