Si vous avez cloné un dépôt Git sur votre Mac et que ses dossiers de sous-modules sont vides, ouvrez Terminal, accédez au dépôt et exécutez git submodule update --init --recursive. Cela initialise les sous-modules enregistrés par le projet, extrait les commits spécifiés par le dépôt parent et prend également en charge les sous-modules imbriqués. Vous devez avoir installé Git et disposer d'un accès au dépôt distant de chaque sous-module.

Exécuter la commande d’initialisation dans le dépôt cloné

Ouvrez Terminal et utilisez cd pour entrer dans le répertoire créé par git clone. Si le nom du répertoire contient des espaces, placez-le entre guillemets, par exemple :

cd "$HOME/Projects/My Project"
git submodule update --init --recursive

Remplacez l’exemple de chemin par l’emplacement réel de votre clone. Vous pouvez également taper cd , faire glisser le dossier du dépôt depuis le Finder dans la fenêtre de Terminal pour insérer son chemin, puis appuyer sur Entrée. Apple documente Terminal comme l'interface de ligne de commande de macOS et indique que zsh est son shell par défaut ; les commandes ci-dessus utilisent la syntaxe shell ordinaire qui fonctionne dans zsh. Ouvrir ou quitter Terminal sur Mac, Changer le shell par défaut dans Terminal sur Mac

La documentation officielle de Git explique que --init initialise les sous-modules qui ne l'ont pas encore été, tandis que --recursive met également à jour les sous-modules imbriqués. update récupère les commits manquants et extrait la révision attendue par le dépôt parent. Documentation de git-submodule

Vérifier si les sous-modules ont été initialisés

Pour voir ce que le dépôt parent enregistre, exécutez :

git submodule status --recursive

Une ligne d’état de sous-module affiche normalement un ID de commit et un chemin. Un signe moins initial signifie que le sous-module n'est pas initialisé ; un signe plus signifie que le commit extrait diffère du commit enregistré par le dépôt parent ; et U indique un conflit. L’option de statut récursive signale également les sous-modules imbriqués. Documentation de git-submodule

Si la sortie liste des chemins précédés de signes moins, réexécutez la commande d'initialisation depuis le répertoire de premier niveau du dépôt. Si aucun sous-module n'apparaît, vérifiez si le clone actuel contient bien un fichier .gitmodules et si vous vous trouvez dans le bon dépôt. Un dépôt peut ne pas comporter de sous-modules, ou le commit que vous avez cloné peut n'en enregistrer aucun.

Comprendre quelle révision est extraite

Un sous-module est un dépôt Git à part entière, et le dépôt parent enregistre un commit spécifique pour celui-ci. Le comportement standard de update extrait ce commit enregistré, laissant couramment le sous-module sur une HEAD détachée. C'est le comportement attendu lorsque vous configurez le projet parent : cela reproduit la version sélectionnée par le parent. Git - Sous-modules, Documentation de git-submodule

Pour cette raison, n’ajoutez pas --remote lorsque votre objectif est simplement d'initialiser le clone. Cette option utilise la branche de suivi à distance d'un sous-module au lieu du commit enregistré par le parent, ce qui peut produire une version différente. Si vous prévoyez de développer à l'intérieur d'un sous-module, renseignez-vous d'abord sur le flux de travail du projet ; basculer sur une branche ou effectuer des commits à l'intérieur est une démarche distincte de son initialisation.

Si la commande échoue

Les mises à jour de sous-modules doivent contacter les dépôts distants indiqués dans la configuration du projet ; ainsi, une panne de réseau ou un manque d'accès peut empêcher l'extraction. Les sous-modules privés peuvent nécessiter une authentification auprès du service d'hébergement ou des droits d'accès au dépôt. Si Git indique qu'il ne parvient pas à trouver un dépôt ou à résoudre un hôte, confirmez votre connexion réseau et vos accès, puis réessayez.

Si un projet a récemment modifié l'URL d'un sous-module, git submodule sync --recursive permet de synchroniser la configuration locale de l'URL à partir de .gitmodules ; enchaînez ensuite avec git submodule update --init --recursive. La documentation de Git mentionne sync pour mettre à jour la configuration d'URL des sous-modules déjà initialisés ou fraîchement ajoutés. Documentation de git-submodule

Si vous avez déjà des modifications locales au sein d'un sous-module, examinez-les avant de forcer toute mise à jour ou de changer de révision. La commande d'initialisation standard ne demande pas à Git d'écraser de force les modifications locales lors de l'extraction ; résolvez ou conservez délibérément ce travail plutôt que de supprimer le répertoire pour contourner le problème.

Dès que git submodule status --recursive affiche les identifiants de commit attendus sans signe moins au début, les révisions de sous-modules enregistrées par le dépôt ont été extraites. Continuez à travailler depuis le dépôt parent, à moins que les instructions du projet n'exigent des tâches distinctes au sein d'un sous-module.

Sources