web-dev-qa-db-fra.com

Comment "cloner" avec les sous-modules?

J'essaie de mettre un sous-module dans un repo. Le problème est que lorsque je clone le référentiel parent, le dossier du sous-module est entièrement vide.

Est-il possible de faire en sorte que git clone parent_repo place les données dans le dossier du sous-module?

Par exemple, http://github.com/cwolves/sequelize/tree/master/lib/ , nodejs-mysql-native pointe vers un sous-module git externe, mais lors de l'extraction de la sequelize projet, ce dossier est vide.

1791
Mark

Avec la version 2.13 de Git et les versions ultérieures, --recurse-submodules peut être utilisé à la place de --recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

Note de l’éditeur: -j8 est une optimisation des performances optionnelle, disponible dans la version 2.8 et permettant d’extraire jusqu’à 8 sous-modules à la fois en parallèle - voir man git-clone.

Avec la version 1.9 de Git jusqu’à la version 2.12 (drapeau -j uniquement disponible à partir de la version 2.8):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

Avec la version 1.6.5 de Git et les versions ultérieures, vous pouvez utiliser:

git clone --recursive git://github.com/foo/bar.git
cd bar

Pour les dépôts déjà clonés ou les anciennes versions de Git, utilisez:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive
2769
Mathias Bynens

Vous devez faire deux choses avant qu'un sous-module ne soit rempli:

git submodule init 
git submodule update
440
LiraNuna

Git 2.23 (T3 2019): si vous voulez cloner et mettre à jour les sous-modules avec leur dernière révision:

_git clone --recurse-submodules --remote-submodules
_

Si vous voulez juste les cloner à leur SHA1 enregistré:

_git clone --recurse-submodules
_

Voir ci-dessous.


Réponse originale 2010

Comme joschi mentionne dans les commentaires, git submodule supporte maintenant le _--recursive_ option (Git 1.6.5 et plus).

Si _--recursive_ est spécifié, cette commande sera renvoyée dans les sous-modules enregistrés et mettra à jour tous les sous-modules imbriqués.

Voir Travailler avec les sous-modules git de manière récursive pour la partie init.
Voir _git submodule_ expliqué pour plus d'informations.

Avec la version 1.6.5 de git et versions ultérieures, vous pouvez le faire automatiquement en clonant le super-projet avec l'option _–-recursive_:

_git clone --recursive git://github.com/mysociety/whatdotheyknow.git
_

Mise à jour 2016, avec git 2.8: voir " Comment accélérer/paralléliser les téléchargements de sous-modules git avec _git clone --recursive_? "

Vous pouvez lancer la récupération du sous-module en utilisant plusieurs threads, en parallèle.
Par exemple:

_git fetch --recurse-submodules -j2
_

Mieux encore, avec Git 2.23 (Q3 2019), vous pouvez cloner et extraire le sous-module de leur branche de suivi en une seule commande!

Voir commit 4c69101 (19 mai 2019) par Ben Avison (``) .
(Fusionné par Junio ​​C Hamano - gitster - dans commit 9476094 , 17 juin 2019)

clone: ajouter le drapeau _--remote-submodules_

Lors de l'utilisation de _git clone --recurse-submodules_, il n'existait auparavant aucun moyen de passer un commutateur _--remote_ à la commande implicite _git submodule update_ pour tout cas d'utilisation pour lequel les sous-modules devaient être extraits sur leur branche de suivi à distance qu'avec le SHA-1 enregistré dans le superprojet.

Ce correctif corrige cette situation.
Il passe réellement de _--no-fetch_ à _git submodule update_ également parce que le sous-module vient tout juste d'être cloné, aussi, aller chercher de la télécommande ne sert qu'à ralentir les choses.

Cela signifie:

_--[no-]remote-submodules:
_

Tous les sous-modules clonés utiliseront l’état de la branche de suivi à distance du sous-module pour mettre à jour le sous-module, plutôt que le SHA-1 enregistré du superprojet. Équivalent à passer de _--remote_ à _git submodule update_.

175
VonC

Vous pouvez utiliser cette commande pour cloner votre repo avec tous les sous-modules:

git clone --recursive YOUR-GIT-REPO-URL

Ou si vous avez déjà cloné le projet, vous pouvez utiliser:

git submodule init
git submodule update
58
Javier C.

Si votre sous-module a été ajouté dans une branche, veillez à l'inclure dans votre commande de clonage ...

git clone -b <branch_name> --recursive <remote> <directory>
31
Mars Redwyne

Essaye ça:

git clone --recurse-submodules

Il extrait automatiquement les données du sous-module en supposant que vous avez déjà ajouté les sous-modules au projet parent.

28
nweiler

Je pense que vous pouvez aller en 3 étapes:

git clone
git submodule init
git submodule update
22
muhammad ali

réponse tardive

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://[email protected]/USERNAME/REPO.git DESTINATION_DIR

Comme je viens de passer une heure entière à bricoler avec un ami: Même si vous avez les droits d’administrateur sur BitBucket, clonez toujours le référentiel ORIGINAL et utilisez le mot de passe de celui qui possède le référentiel. Ennuyant de savoir que vous avez rencontré ce minetrap: P

20
kaiser

Essayez ceci pour inclure des sous-modules dans le dépôt git.

git clone -b <branch_name> --recursive <remote> <directory>

o

git clone --recurse-submodules
18
radhey shyam

Vous pouvez utiliser l'indicateur --recursive lors du clonage d'un référentiel. Ce paramètre oblige git à cloner tous les sous-modules définis dans le référentiel.

git clone --recursive [email protected]:your_repo.git

Après le clonage, il est parfois possible de changer les branches des sous-modules, alors lancez la commande suivante:

git submodule foreach "git checkout master"
15
Ahmad Azimi

L'extraction parallèle de sous-modules vise à réduire le temps requis pour l'extraction d'un référentiel et de tous ses sous-modules associés en permettant l'extraction simultanée de plusieurs référentiels. Ceci peut être accompli en utilisant la nouvelle option --jobs, par exemple:

git fetch --recurse-submodules --jobs=4

Selon l'équipe de Git, cela peut considérablement accélérer la mise à jour des référentiels contenant de nombreux sous-modules. Lorsque vous utilisez --recurse-submodules sans la nouvelle option --jobs, Git ira chercher les sous-modules un par un.

Source: http://www.infoq.com/news/2016/03/git28-released

11
Long Nguyen

[Réponse rapide]

Après avoir cloné le référant parent (qui contenait un référentiel de sous-module), procédez comme suit:

git submodule update --init --recursive
9
Benyamin Jafari

Essaye ça.

git clone -b <branch_name> --recursive <remote> <directory>

Si vous avez ajouté le sous-module dans une branche, assurez-vous de l'ajouter à la commande clone.

5
Himeshika96

J'ai eu le même problème pour un référentiel GitHub. La clé SSH manquait dans mon compte. Le processus est

  1. Générer une clé SSH
  2. Ajouter une nouvelle clé SSH à votre compte GitHub

Ensuite, vous pouvez cloner le référentiel avec des sous-modules (git clone --recursive YOUR-GIT-REPO-URL)

ou

Exécutez git submodule init et git submodule update pour récupérer des sous-modules dans un référentiel déjà cloné.

1
FatalError

Si c'est un nouveau projet, vous pouvez simplement faire comme ceci:

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

S'il est déjà installé, alors:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
0
nzrytmn