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-pages
Zweig 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-demand
Option 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
check
verwendet, 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-demand
verwendet, 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
:recurseSubmodules
Konfigurationsoption hinzufügenDer
--recurse-submodules
Befehlszeilenparameter existiert seit einiger Zeit, hat jedoch keine entsprechende Entsprechung für die Konfigurationsdatei.
git fetch
Lassen 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,
push
Code aufsubmodule-config
ähnliche Weise wie zu verwendenfetch
.
Das git config
Dokument 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-run
fü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-run
Option zu respektieren, wenn sie so konfiguriert ist, dass Submodule bei Bedarf rekursiv übertragen werden.
Dies erfolgt durch Übergeben des--dry-run
Flags 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=only
Option , 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 .