Est-il possible d'avoir des sous-modules peu profonds? J'ai un superprojet avec plusieurs sous-modules, chacun avec une longue histoire, donc ça devient inutilement gros de traîner toute cette histoire.
Tout ce que j'ai trouvé, c'est ce fil sans réponse .
Dois-je simplement pirater git-submodule pour implémenter cela?
git
git-submodules
Mauricio Scheffer
la source
la source
git submodule add/update
" peut maintenant cloner les dépôts de sous-modules de manière superficielle! Voir ma réponse ciRéponses:
Nouveau dans le prochain git1.8.4 (juillet 2013) :
(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 :
Cela signifie que cela fonctionne:
Avec:
atwyman ajoute dans les commentaires :
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)MVG souligne dans les commentaires pour commettre fb43e31 (git 2.9, février 2016)
Mise à jour août 2016 (3 ans plus tard)
Avec Git 2.10 (Q3 2016), vous pourrez faire
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)Cependant, Ciro Santilli ajoute dans les commentaires (et des détails dans sa réponse )
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)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)Attention: avec Git 2.25 (Q1 2020), l'interaction entre "
git clone --recurse-submodules
" et le magasin d'objets alternatif était mal conçue.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)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.
La documentation du sous-module de configuration comprend désormais:
la source
--depth
devrait prendre une dispute aussi;)uploadpack.allowReachableSHA1InWant
etuploadpack.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..gitmodules
, l'--depth 1
option fonctionne-t-elle pour les succursales qui ne suivent pas le maître de près?Git 2.9.0 prend en charge directement les sous-modules de clonage superficiel, vous pouvez donc simplement appeler:
la source
Suite à la réponse de Ryan, j'ai pu créer ce script simple qui itère à travers tous les sous-modules et les clone superficiellement:
la source
fatal: reference is not a tree: 88fb67b07621dfed054d8d75fd50672fb26349df
pour chaque sousEn lisant le git-submodule "source", il semble
git submodule add
pouvoir gérer les sous-modules qui ont déjà leurs dépôts présents. Dans ce cas...Vous voudrez vous assurer que le commit requis est dans le dépôt de sous-modules, alors assurez-vous de définir un --depth approprié.
Edit: Vous pourrez peut-être vous en sortir avec plusieurs clones de sous-modules manuels suivis d'une seule mise à jour:
la source
Résumé du comportement bogué / inattendu / ennuyeux à partir de Git 2.14.1
shallow = true
in.gitmodules
affecte uniquementgit clone --recurse-submodules
si leHEAD
du sous-module distant pointe vers le commit requis, même si le commit cible est pointé par une branche, et même si vous mettezbranch = mybranch
le.gitmodules
aussi.Script de test local . Même comportement sur GitHub 2017-11, où
HEAD
est contrôlé par le paramètre de dépôt de branche par défaut:git clone --recurse-submodules --shallow-submodules
échoue si le Commit est ni référencé par une branche ou une étiquette avec un message:error: Server does not allow request for unadvertised object
.Script de test local . Même comportement sur GitHub:
J'ai également demandé sur la liste de diffusion: https://marc.info/?l=git&m=151863590026582&w=2 et la réponse était:
Test TODO:
allowReachableSHA1InWant
.la source
git clone --recursive
qui ne récupèrent que ce commit spécifique.Les emplacements canoniques de vos sous-modules sont-ils distants? Si oui, êtes-vous d'accord pour les cloner une fois? En d'autres termes, voulez-vous les clones peu profonds simplement parce que vous souffrez de la bande passante gaspillée de fréquents (re) clones de sous-modules?
Si vous voulez que les clones peu profonds sauvent l'espace disque local, alors la réponse de Ryan Graham semble être une bonne solution. Clonez manuellement les référentiels afin qu'ils soient superficiels. Si vous pensez que cela serait utile, adaptez-vous
git submodule
pour le soutenir. Envoyez un email à la liste pour en savoir plus (conseils pour sa mise en œuvre, suggestions sur l'interface, etc.). À mon avis, les gens là-bas soutiennent tout à fait les contributeurs potentiels qui souhaitent sincèrement améliorer Git de manière constructive.Si vous êtes d'accord pour faire un clone complet de chaque sous-module (plus des récupérations ultérieures pour les garder à jour), vous pouvez essayer d'utiliser l'
--reference
option degit submodule update
(c'est dans Git 1.6.4 et versions ultérieures) pour faire référence aux magasins d'objets locaux (par exemple créer des--mirror
clones des référentiels de sous-modules canoniques, puis les utiliser--reference
dans vos sous-modules pour pointer vers ces clones locaux). Assurez-vous simplement de lire surgit clone --reference
/git clone --shared
avant d'utiliser--reference
. Le seul problème probable avec les miroirs de référencement serait s'ils finissent par récupérer des mises à jour non rapides (bien que vous puissiez activer les reflogs et étendre leurs fenêtres d'expiration pour aider à conserver les commits abandonnés qui pourraient causer un problème). Vous ne devriez pas avoir de problèmes tant queSi vous optez pour quelque chose comme ça et qu'il y a une chance que vous puissiez transporter des commits de sous-modules locaux dans vos arbres de travail, ce serait probablement une bonne idée de créer un système automatisé qui s'assure que les objets critiques référencés par les sous-modules extraits ne sont pas laissé en suspens dans les référentiels miroir (et le cas échéant, les copie dans les référentiels qui en ont besoin).
Et, comme le
git clone
dit la page de manuel, ne l'utilisez pas--reference
si vous ne comprenez pas ces implications.Vous
--reference
pouvez également utiliser les clones de miroir en combinaison avec la fonctionnalité de liaison fixe par défaut degit clone
en utilisant des miroirs locaux comme source pour vos sous-modules. Dans les nouveaux clones de super-projet, faitesgit submodule init
, modifiez les URL des sous-modules.git/config
pour pointer vers les miroirs locaux, puis faitesgit submodule update
. Vous devrez recloner tous les sous-modules extraits existants pour obtenir les liens physiques. Vous économiseriez de la bande passante en ne téléchargeant qu'une seule fois dans les miroirs, puis en les récupérant localement dans vos sous-modules extraits. La liaison matérielle permettrait d'économiser de l'espace disque (bien que les récupérations aient tendance à s'accumuler et à être dupliquées sur plusieurs instances des magasins d'objets des sous-modules extraits; vous pouvez périodiquement recloner les sous-modules extraits des miroirs pour récupérer l'économie d'espace disque fournie par liaison directe).la source
J'ai créé une version légèrement différente, pour quand elle ne fonctionne pas à la fine pointe, ce que tous les projets ne font pas. Les ajouts de sous-modules standard n'ont pas fonctionné, pas plus que le script ci-dessus. J'ai donc ajouté une recherche de hachage pour la référence de la balise, et si elle n'en a pas, elle revient au clonage complet.
la source
Référence à Comment cloner le référentiel git avec une révision / un ensemble de modifications spécifique?
J'ai écrit un script simple qui ne pose aucun problème lorsque la référence de votre sous-module est éloignée du maître
Cette instruction récupérera la version référencée du sous-module.
C'est rapide mais vous ne pouvez pas valider votre modification sur le sous-module (vous devez le récupérer avant https://stackoverflow.com/a/17937889/3156509 )
en entier:
la source
Le clonage superficiel d'un sous-module est parfait car ils prennent un instantané à une révision / modification particulière. Il est facile de télécharger un zip à partir du site Web, j'ai donc essayé un script.
git submodule deinit --all -f
efface l'arborescence des sous-modules qui permet au script d'être réutilisable.git submodule
récupère les 40 caractères sha1 suivis d'un chemin qui correspond au même dans.gitmodules
. J'utilise perl pour concaténer ces informations, délimitées par deux points, puis j'utilise une transformation variable pour séparer les valeurs enmysha
etmysub
.Ce sont les clés critiques car nous avons besoin du sha1 pour télécharger et du chemin pour corréler les
url
in .gitmodules.Étant donné une entrée de sous-module typique:
myurl
touches surpath =
puis regarde 2 lignes après pour obtenir la valeur. Cette méthode peut ne pas fonctionner de manière cohérente et nécessiter des améliorations. L'url grep supprime toutes les.git
références de type restantes en les faisant correspondre à la dernière/
et à tout ce qui.
.mydir
estmysub
moins une finale/name
qui serait par le répertoire menant au nom du sous-module.Vient ensuite un
wget
avec le format de l'url d'archive zip téléchargeable. Cela pourrait changer à l'avenir.Décompressez le fichier dans
mydir
lequel se trouverait le sous-répertoire spécifié dans le chemin du sous-module. Le dossier résultant sera le dernier élément duurl
-sha1
.Vérifiez si le sous-répertoire spécifié dans le chemin du sous-module existe et supprimez-le pour permettre le changement de nom du dossier extrait.
mv
renommez le dossier extrait contenant notre sha1 en son chemin de sous-module correct.Supprimer le fichier zip téléchargé.
Init du sous-module
Il s'agit plus d'une preuve de concept WIP qu'une solution. Quand cela fonctionne, le résultat est un clone superficiel d'un sous-module à un changeset spécifié.
Si le référentiel réintègre un sous-module vers un commit différent, réexécutez le script pour mettre à jour.
Le seul moment où un script comme celui-ci serait utile est pour la construction locale non collaborative d'un projet source.
la source