Nouveau dans le prochain git1.8.4 (juillet 2013) :
" git submodule update
" peut éventuellement cloner les dépôts de sous-modules de manière superficielle.
(Et git 2.10 Q3 2016 permet d'enregistrer cela avec git config -f .gitmodules submodule.<name>.shallow true
.
Voir la fin de cette réponse)
Voir commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Ajouter le --depth
option aux commandes d'ajout et de mise à jour de "git submodule", qui est ensuite transmise à la commande clone. Ceci est utile lorsque le ou les sous-modules sont énormes et que vous n'êtes pas vraiment intéressé par autre chose que le dernier commit.
Des tests sont ajoutés et quelques ajustements d'indentation ont été faits pour se conformer au reste du fichier de test sur "la mise à jour des sous-modules peut gérer les liens symboliques dans pwd".
Signé par: Fredrik Gustafsson <iveqy@iveqy.com>
Reconnu par: Jens Lehmann<Jens.Lehmann@web.de>
Cela signifie que cela fonctionne:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
Avec:
--depth::
Cette option est valable pour les commandes add
et update
.
Créez un clone «superficiel» avec un historique tronqué au nombre de révisions spécifié.
atwyman ajoute dans les commentaires :
Pour autant que je sache, cette option n'est pas utilisable pour les sous-modules qui ne suivent pas de master
très près. Si vous définissez la profondeur 1, submodule update
cela ne peut réussir que si le commit de sous-module souhaité est le dernier maître. Sinon, vous obtenez " fatal: reference is not a tree
" .
C'est vrai.
Autrement dit, jusqu'à git 2.8 (mars 2016). Avec la version 2.8, le submodule update --depth
a une chance de plus de réussir, même si le SHA1 est directement accessible à partir de l'un des HEAD du repo distant.
Voir commit fb43e31 (24 février 2016) par Stefan Beller ( stefanbeller
) .
Aide: Junio C Hamano ( gitster
) .
(Fusionné par Junio C Hamano - gitster
- in commit 9671a76 , 26 février 2016)
sous-module: essayez plus fort de récupérer sha1 nécessaire en récupérant directement sha1
Lors de la révision d'un changement qui met également à jour un sous-module dans Gerrit, une pratique de révision courante consiste à télécharger et à sélectionner le correctif localement pour le tester.
Cependant, lors du test local, le ' git submodule update
' peut échouer lors de la récupération du sous-module correct sha1 car le commit correspondant dans le sous-module ne fait pas encore partie de l'historique du projet, mais aussi simplement une proposition de changement.
Si $sha1
ne faisait pas partie de la récupération par défaut, nous essayons de récupérer $sha1
directement le fichier . Cependant, certains serveurs ne prennent pas en charge la récupération directe par sha1, ce qui conduit git-fetch
à une panne rapide.
Nous pouvons nous échouer ici car le sha1 encore manquant entraînerait de toute façon un échec plus tard dans la phase de vérification, donc échouer ici est aussi bien que nous pouvons l'obtenir.
MVG souligne dans les commentaires pour commettre fb43e31 (git 2.9, février 2016)
Il me semble que le commit fb43e31 demande le commit manquant par ID SHA1, donc les paramètres uploadpack.allowReachableSHA1InWant
et uploadpack.allowTipSHA1InWant
sur le serveur affecteront probablement si cela fonctionne.
J'ai écrit un article sur la liste git aujourd'hui , indiquant comment l'utilisation de sous-modules peu profonds pourrait être améliorée pour certains scénarios, à savoir si le commit est également une balise.
Attendons voir.
Je suppose que c'est une raison pour laquelle fb43e31 a fait de la récupération pour un SHA1 spécifique une solution de secours après la récupération de la branche par défaut.
Néanmoins, dans le cas de «--depth 1», je pense qu'il serait logique d'abandonner prématurément: si aucune des références répertoriées ne correspond à celle demandée et que la demande par SHA1 n'est pas prise en charge par le serveur, alors il n'y a aucun intérêt à chercher quoi que ce soit, car nous ne serons pas en mesure de satisfaire l'exigence de sous-module de toute façon.
Mise à jour août 2016 (3 ans plus tard)
Avec Git 2.10 (Q3 2016), vous pourrez faire
git config -f .gitmodules submodule.<name>.shallow true
Voir « Sous-module Git sans poids supplémentaire » pour en savoir plus.
Git 2.13 (Q2 2017) ajoute le commit 8d3047c (19 avril 2017) par Sebastian Schuberth ( sschuberth
) .
(Fusionné par Sebastian Schuberth - sschuberth
- in commit 8d3047c , 20 avril 2017)
un clone de ce sous-module sera effectué comme un clone peu profond (avec une profondeur d'historique de 1)
Cependant, Ciro Santilli ajoute dans les commentaires (et des détails dans sa réponse )
shallow = true
on .gitmodules
n'affecte que la référence suivie par le HEAD de la télécommande lors de l'utilisation --recurse-submodules
, même si le commit cible est pointé par une branche, et même si vous mettez branch = mybranch
le .gitmodules
aussi.
Git 2.20 (Q4 2018) améliore la prise en charge des sous-modules, qui a été mis à jour pour lire à partir de l'objet blob HEAD:.gitmodules
lorsque le .gitmodules
fichier est absent de l'arborescence de travail.
Voir commit 2b1257e , commit 76e9bdc (25 octobre 2018) et commit b5c259f , commit 23dd8f5 , commit b2faad4 , commit 2502ffc , commit 996df4d , commit d1b13df , commit 45f5ef3 , commit bcbc780 (05 octobre 2018) par Antonio Ospite ( ao2
) .
(Fusionné par Junio C Hamano - gitster
- dans commit abb4824 , 13 novembre 2018)
submodule
: supporte la lecture .gitmodules
quand ce n'est pas dans l'arbre de travail
Lorsque le .gitmodules
fichier n'est pas disponible dans l'arborescence de travail, essayez d'utiliser le contenu de l'index et de la branche actuelle.
Cela couvre le cas où le fichier fait partie du référentiel mais pour une raison quelconque, il n'est pas extrait, par exemple en raison d'une extraction éparse.
Cela permet d'utiliser au moins les git submodule
commandes ' ' qui lisent le gitmodules
fichier de configuration sans remplir complètement l'arborescence de travail.
L'écriture dans .gitmodules
nécessitera toujours que le fichier soit extrait, alors vérifiez-le avant d'appeler config_set_in_gitmodules_file_gently
.
Ajoutez également une vérification similaire git-submodule.sh::cmd_add()
pour anticiper l'échec éventuel de la git submodule add
commande " " lorsqu'elle .gitmodules
n'est pas inscriptible en toute sécurité; cela empêche la commande de laisser le référentiel dans un état faux (par exemple, le référentiel de sous-modules a été cloné mais .gitmodules
n'a pas été mis à jour car config_set_in_gitmodules_file_gently
échoué).
De plus, étant donné qu'il config_from_gitmodules()
accède désormais au magasin d'objets global, il est nécessaire de protéger tous les chemins de code qui appellent la fonction contre l'accès simultané au magasin d'objets global.
Actuellement, cela ne se produit que dans builtin/grep.c::grep_submodules()
, alors appelez
grep_read_lock()
avant d'appeler du code impliquant config_from_gitmodules()
.
REMARQUE: il existe un cas rare où cette nouvelle fonctionnalité ne fonctionne pas encore correctement: les sous-modules imbriqués sans .gitmodules
dans leur arbre de travail.
Remarque: Git 2.24 (Q4 2019) corrige un éventuel segfault lors du clonage d'un sous-module peu profond.
Voir commit ddb3c85 (30 sept. 2019) par Ali Utku Selen ( auselen
) .
(Fusionné par Junio C Hamano - gitster
- dans commit 678a9ca , 09 octobre 2019)
Git 2.25 (Q1 2020), clarifie la git submodule update
documentation.
Voir commit f0e58b3 (24 nov.2019 ) de Philippe Blain ( phil-blain
) .
(Fusionné par Junio C Hamano - gitster
- in commit ef61045 , 05 déc 2019)
doc
: mentionnez que 'git submodule update' récupère les commits manquants
Aide: Junio C Hamano
Aide: Johannes Schindelin
Signature: Philippe Blain
'git submodule
update' récupérera les nouveaux commits du sous-module distant si le SHA-1 enregistré dans le superprojet n'est pas trouvé . Cela n'a pas été mentionné dans la documentation.
Attention: avec Git 2.25 (Q1 2020), l'interaction entre " git clone --recurse-submodules
" et le magasin d'objets alternatif était mal conçue.
La documentation et le code ont appris à faire des recommandations plus claires lorsque les utilisateurs constatent des échecs.
Voir commit 4f3e57e , commit 10c64a0 (02 décembre 2019) par Jonathan Tan ( jhowtan
) .
(Fusionné par Junio C Hamano - gitster
- in commit 5dd1d59 , 10 déc 2019)
submodule--helper
: avis sur une erreur alternative fatale
Signé par: Jonathan Tan
Reconnu par: Jeff King
Lors du clonage récursif d'un superprojet avec des modules peu profonds définis dans son .gitmodules
, puis reclonage avec " --reference=<path>
", une erreur se produit. Par exemple:
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
échoue avec:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
Lorsqu'une alternative calculée à partir de l'alternative du superprojet ne peut pas être ajoutée, que ce soit dans ce cas ou dans un autre, conseillez de configurer l' submodule.alternateErrorStrategy
option de configuration " " et d'utiliser " --reference-if-able
" au lieu de " --reference
" lors du clonage.
Cela est détaillé dans:
Avec Git 2.25 (Q1 2020), l'interaction entre "git clone --recurse-submodules" et un magasin d'objets alternatif était mal conçue.
Doc
: expliquer submodule.alternateErrorStrategy
Signé par: Jonathan Tan
Reconnu par: Jeff King
Commit 31224cbdc7 (" clone
: l'option récursive et de référence déclenche des alternatives de sous-module", 17/08/2016, Git v2.11.0-rc0 - fusion répertoriée dans le lot n ° 1 ) a appris à Git à prendre en charge les options de configuration " submodule.alternateLocation
" et " submodule.alternateErrorStrategy
" sur un superprojet .
Si " submodule.alternateLocation
" est configuré sur " superproject
" sur un superprojet, chaque fois qu'un sous-module de ce superprojet est cloné, il calcule à la place le chemin alternatif analogue pour ce sous-module à partir $GIT_DIR/objects/info/alternates
du superprojet et y fait référence.
L' submodule.alternateErrorStrategy
option " " détermine ce qui se passe si cette alternative ne peut pas être référencée.
Cependant, il n'est pas clair que le clone se déroule comme si aucune alternative n'était spécifiée lorsque cette option n'est pas définie sur "die" (comme on peut le voir dans les tests de 31224cbdc7 ).
Par conséquent, documentez-le en conséquence.
La documentation du sous-module de configuration comprend désormais:
submodule.alternateErrorStrategy::
Spécifie comment traiter les erreurs avec les alternatives pour un sous-module comme calculé via submodule.alternateLocation
.
Les valeurs possibles sont ignore
, info
, die
.
La valeur par défaut est die
.
Notez que s'il est défini sur ignore
ou info
, et s'il y a une erreur avec l'alternative calculée, le clone se déroule comme si aucune alternative n'était spécifiée .
git submodule add/update
" peut maintenant cloner les dépôts de sous-modules de manière superficielle! Voir ma réponse ci