Neu im kommenden git1.8.4 (Juli 2013) :
" git submodule update
" kann optional die Submodul-Repositorys flach klonen.
(Und Git 2.10 Q3 2016 ermöglicht es, dies mit aufzuzeichnen git config -f .gitmodules submodule.<name>.shallow true
.
Siehe das Ende dieser Antwort)
Siehe Commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Fügen Sie die --depth
Option zu den Befehlen zum Hinzufügen und Aktualisieren von "git submodule" hinzu, die dann an den Befehl clone weitergeleitet werden. Dies ist nützlich, wenn die Submodule sehr groß sind und Sie nur an dem neuesten Commit interessiert sind.
Es werden Tests hinzugefügt und einige Einrückungsanpassungen vorgenommen, um dem Rest der Testdatei zu entsprechen. "Submodul-Update kann symbolische Links in pwd verarbeiten".
Unterzeichnet von: Fredrik Gustafsson <iveqy@iveqy.com>
Bestätigt von: Jens Lehmann<Jens.Lehmann@web.de>
Das heißt, das funktioniert:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
Mit:
--depth::
Diese Option gilt für add
und update
Befehle.
Erstellen Sie einen "flachen" Klon mit einem Verlauf, der auf die angegebene Anzahl von Revisionen abgeschnitten ist.
atwyman fügt in den Kommentaren hinzu :
Soweit ich das beurteilen kann, ist diese Option nicht für Submodule geeignet, die nicht master
sehr genau verfolgt werden. Wenn Sie Tiefe 1 festlegen, submodule update
kann dies nur dann erfolgreich sein, wenn das gewünschte Submodul-Commit der neueste Master ist. Sonst bekommst du " fatal: reference is not a tree
" .
Das ist wahr.
Das heißt, bis Git 2.8 (März 2016). Mit 2.8 submodule update --depth
hat der eine weitere Erfolgschance, selbst wenn der SHA1 direkt von einem der Remote-Repo-Köpfe aus erreichbar ist.
Siehe Commit fb43e31 (24. Februar 2016) von Stefan Beller ( stefanbeller
) .
Mit freundlichergitster
Unterstützung von Junio C Hamano ( ) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 9671a76 , 26. Februar 2016)
Submodul: Versuchen Sie stärker, das benötigte sha1 durch direktes Abrufen von sha1 abzurufen
Bei der Überprüfung einer Änderung, mit der auch ein Submodul in Gerrit aktualisiert wird, wird häufig empfohlen, den Patch lokal herunterzuladen und auszuwählen, um ihn zu testen.
Beim lokalen Testen kann es jedoch vorkommen, dass das ' git submodule update
' das richtige Submodul sha1 nicht abruft, da das entsprechende Commit im Submodul noch nicht Teil der Projekthistorie ist, sondern nur eine vorgeschlagene Änderung.
Wenn dies $sha1
nicht Teil des Standardabrufs war, versuchen wir, den $sha1
direkt abzurufen . Einige Server unterstützen jedoch kein direktes Abrufen durch sha1, was git-fetch
zu einem schnellen Ausfall führt .
Wir können hier versagen, da das noch fehlende sha1 später in der Checkout-Phase ohnehin zu einem Fehler führen würde. Daher ist ein Fehler hier so gut wie möglich.
MVG weist in den Kommentaren darauf hin , fb43e31 zu verpflichten (git 2.9, Feb 2016)
Es scheint mir, dass Commit fb43e31 das fehlende Commit nach SHA1-ID anfordert, sodass die Einstellungen uploadpack.allowReachableSHA1InWant
und uploadpack.allowTipSHA1InWant
auf dem Server wahrscheinlich Einfluss darauf haben, ob dies funktioniert.
Ich habe heute einen Beitrag in die Git-Liste geschrieben , in dem ich darauf hinwies, wie die Verwendung von flachen Submodulen für einige Szenarien besser funktionieren könnte, wenn das Commit auch ein Tag ist.
Lass uns abwarten und sehen.
Ich denke, dies ist ein Grund, warum fb43e31 den Abruf für einen bestimmten SHA1 zu einem Fallback nach dem Abruf für den Standardzweig gemacht hat.
Im Falle von "--depth 1" halte ich es jedoch für sinnvoll, vorzeitig abzubrechen: Wenn keine der aufgelisteten Refs mit der angeforderten übereinstimmt und die Anfrage von SHA1 vom Server nicht unterstützt wird, hat dies keinen Sinn etwas abrufen, da wir die Submodul-Anforderung in beiden Fällen nicht erfüllen können.
Update August 2016 (3 Jahre später)
Mit Git 2.10 (Q3 2016) können Sie dies tun
git config -f .gitmodules submodule.<name>.shallow true
Weitere Informationen finden Sie unter " Git-Submodul ohne zusätzliches Gewicht ".
Git 2.13 (Q2 2017) fügt Commit 8d3047c (19. April 2017) von Sebastian Schuberth ( sschuberth
) hinzu .
(Zusammengeführt von Sebastian Schuberth - sschuberth
- in Commit 8d3047c , 20. April 2017)
Ein Klon dieses Submoduls wird als flacher Klon ausgeführt (mit einer Verlaufstiefe von 1).
Allerdings Ciro Santilli fügt in den Kommentaren (und Details in seiner Antwort )
shallow = true
Ein .gitmodules
wirkt sich nur auf die Referenz aus, die bei Verwendung vom HEAD der Fernbedienung verfolgt wird --recurse-submodules
, selbst wenn das Ziel-Commit von einem Zweig angezeigt wird, und selbst wenn Sie branch = mybranch
das .gitmodules
auch aktivieren.
Git 2.20 (Q4 2018) verbessert die Submodul-Unterstützung, die aktualisiert wurde, um aus dem Blob zu lesen, HEAD:.gitmodules
wenn die .gitmodules
Datei im Arbeitsbaum fehlt.
Siehe Commit 2b1257e , Commit 76e9bdc (25. Oktober 2018) und Commit b5c259f , Commit 23dd8f5 , Commit b2faad4 , Commit 2502ffc , Commit 996df4d , Commit d1b13df , Commit 45f5ef3 , Commit bcbc780 (05. Oktober 2018) von Antonio Ospite ( ao2
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit abb4824 , 13. November 2018)
submodule
: Unterstützung beim Lesen, .gitmodules
wenn es nicht im Arbeitsbaum ist
Wenn die .gitmodules
Datei im Arbeitsbaum nicht verfügbar ist, versuchen Sie, den Inhalt aus dem Index und aus dem aktuellen Zweig zu verwenden.
Dies gilt für den Fall, dass die Datei Teil des Repositorys ist, aber aus irgendeinem Grund nicht ausgecheckt wird, z. B. aufgrund einer spärlichen Prüfung.
Dies ermöglicht es, mindestens die git submodule
Befehle ' ' zu verwenden, mit denen die Konfigurationsdatei gelesengitmodules
wird, ohne den Arbeitsbaum vollständig zu füllen.
Für das Schreiben in .gitmodules
muss die Datei weiterhin ausgecheckt sein. Überprüfen Sie dies vor dem Aufruf config_set_in_gitmodules_file_gently
.
Fügen Sie eine ähnliche Prüfung hinzu git-submodule.sh::cmd_add()
, um den eventuellen Fehler des git submodule add
Befehls " " zu antizipieren, wenn er .gitmodules
nicht sicher beschreibbar ist. Dies verhindert, dass der Befehl das Repository in einem falschen Zustand verlässt (z. B. wurde das Submodul-Repository geklont, aber .gitmodules
nicht aktualisiert, weil es config_set_in_gitmodules_file_gently
fehlgeschlagen ist).
Da config_from_gitmodules()
jetzt auf den globalen Objektspeicher zugegriffen wird, müssen außerdem alle Codepfade, die die Funktion aufrufen, vor gleichzeitigem Zugriff auf den globalen Objektspeicher geschützt werden.
Derzeit geschieht dies nur in builtin/grep.c::grep_submodules()
, rufen Sie also auf,
grep_read_lock()
bevor Sie den betreffenden Code aufrufen config_from_gitmodules()
.
HINWEIS: Es gibt einen seltenen Fall, in dem diese neue Funktion noch nicht ordnungsgemäß funktioniert: verschachtelte Submodule ohne .gitmodules
in ihrem Arbeitsbaum.
Hinweis: Git 2.24 (Q4 2019) behebt einen möglichen Segfault beim Klonen eines flachen Submoduls.
Siehe Commit ddb3c85 (30. September 2019) von Ali Utku Selen ( auselen
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 678a9ca , 09. Oktober 2019)
Git 2.25 (Q1 2020) verdeutlicht die git submodule update
Dokumentation.
Siehe Commit f0e58b3 (24. November 2019) von Philippe Blain ( phil-blain
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit ef61045 , 05. Dezember 2019)
doc
: Erwähne, dass 'git submodule update' fehlende Commits abruft
Unterstützt von: Junio C Hamano
Unterstützt von: Johannes Schindelin
Unterzeichnet von: Philippe Blain
' git submodule
update' ruft neue Commits von der Submodul-Fernbedienung ab, wenn der im Superprojekt aufgezeichnete SHA-1 nicht gefunden wird . Dies wurde in der Dokumentation nicht erwähnt.
Warnung: Mit Git 2.25 (Q1 2020) war die Interaktion zwischen " git clone --recurse-submodules
" und alternativem Objektspeicher schlecht gestaltet.
Die Dokumentation und der Code wurden gelehrt, um klarere Empfehlungen abzugeben, wenn die Benutzer Fehler sehen.
Siehe Commit 4f3e57e , Commit 10c64a0 (02. Dezember 2019) von Jonathan Tan ( jhowtan
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 5dd1d59 , 10. Dezember 2019)
submodule--helper
: Hinweise zu schwerwiegenden alternativen Fehlern
Unterzeichnet von: Jonathan Tan
Bestätigt von: Jeff King
Beim rekursiven Klonen eines Superprojekts mit einigen darin definierten flachen Modulen und beim .gitmodules
erneuten Klonen mit " --reference=<path>
" tritt ein Fehler auf. Beispielsweise:
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
master
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
--reference master master2
schlägt fehl mit:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
Wenn eine Alternative, die aus der Alternative des Superprojekts berechnet wurde, in diesem oder einem anderen Fall nicht hinzugefügt werden kann, sollten Sie die Konfigurationsoption submodule.alternateErrorStrategy
konfigurieren und beim Klonen " --reference-if-able
" anstelle von " --reference
" verwenden.
Das ist detailliert in:
Mit Git 2.25 (Q1 2020) war die Interaktion zwischen "git clone --recurse-submodules" und dem alternativen Objektspeicher schlecht gestaltet.
Doc
: Erkläre submodule.alternateErrorStrategy
Unterzeichnet von: Jonathan Tan
Bestätigt von: Jeff King
Commit 31224cbdc7 (" clone
: rekursive und Referenzoption löst Submodulalternativen aus", 2016-08-17, Git v2.11.0-rc0 - Zusammenführung in Stapel 1 aufgeführt ) brachte Git bei, die Konfigurationsoptionen " submodule.alternateLocation
" und " submodule.alternateErrorStrategy
" für ein Superprojekt zu unterstützen .
Wenn " submodule.alternateLocation
" für " superproject
" in einem Superprojekt konfiguriert ist, berechnet es jedes Mal, wenn ein Submodul dieses Superprojekts geklont wird, stattdessen den analogen alternativen Pfad für dieses Submodul aus $GIT_DIR/objects/info/alternates
dem Superprojekt und verweist darauf.
Die submodule.alternateErrorStrategy
Option " " bestimmt, was passiert, wenn auf diese Alternative nicht verwiesen werden kann.
Es ist jedoch nicht klar, dass der Klon so vorgeht, als ob keine Alternative angegeben worden wäre, wenn diese Option nicht auf "sterben" gesetzt ist (wie aus den Tests in 31224cbdc7 hervorgeht ).
Dokumentieren Sie es daher entsprechend.
Die Dokumentation zum Konfigurations-Submodul enthält jetzt:
submodule.alternateErrorStrategy::
Gibt an, wie Fehler mit den Alternativen für ein Submodul behandelt werden, wie über berechnet submodule.alternateLocation
.
Mögliche Werte sind ignore
, info
, die
.
Standard ist die
.
Beachten Sie, dass der Klon so fortgesetzt wird, als ob keine Alternative angegeben wurde , wenn auf ignore
oder gesetzt info
ist und ein Fehler mit der berechneten Alternative vorliegt .
git submodule add/update
" kann jetzt die Submodul-Repositorys flach klonen! Siehe meine Antwort unten