web-dev-qa-db-fra.com

Comment puis-je git clone --recursive et checkout master sur tous les sous-modules sur une seule ligne?

J'aime vraiment cette commande pour récupérer un dépôt avec des sous-modules:

git clone [email protected]:my_user/my_repo.git --recursive

Cependant, les sous-modules sont tous définis sur "aucune branche" à leur arrivée, et je dois vérifier manuellement le maître sur chacun d'eux. Existe-t-il un moyen de tirer récursivement des sous-modules et de définir automatiquement la branche sur master?

48
tedsuo

Après avoir cloné le référentiel contenant vos sous-modules, la commande suivante va extraire la branche principale sur tous ces éléments en une seule fois:

git submodule foreach --recursive git checkout master
65
qbein

Que diriez-vous:

git submodule update --init --recursive

Pour initialiser tous les sous-modules et sous-modules à l'intérieur des sous-modules. Je ne sais pas si cela ira au maître.

55
Mauvis Ledford

La question est pourquoi vous maître de caisse. Vos sous-modules sont épinglés sur un sha spécifique - c'est aussi pourquoi les clones de sous-modules sont fixés sur ce commit spécifique. En ne pointant pas sur un sha spécifique, un dépôt externe pourrait facilement casser vos builds. Certainement pas ce que vous voulez. Mieux mettre à jour consciemment. Les versions doivent être reproductibles et aussi fixes que possible.

24
tcurdt

Vous devriez peut-être considérer gitslave comme une alternative à git-submodule, selon votre flux de travail de développement, il peut être meilleur (ou pire). Spécifiquement à votre problème, gitslave garde tous les membres du superprojet sur la même branche (en l'absence de commandes git spécifiques (pas gitslave) pour faire autrement, et même alors, de nombreuses commandes vous avertissent lorsque vous êtes sur des branches différentes).

Gitslave est utile lorsque vous contrôlez et développez sur les sous-projets plus ou moins en même temps que le superprojet, et en outre lorsque vous souhaitez généralement baliser, créer des branches, pousser, tirer, etc. tous les référentiels en même temps temps.

git-submodule est préférable lorsque vous ne contrôlez pas les sous-projets ou souhaitez plus spécifiquement fixer le sous-projet à une révision spécifique même lorsque le sous-projet change.

6
Seth Robertson

Comme déjà répondu

git submodule foreach --recursive git checkout master

fait le travail pour la branche master.

Mais si c'est une branche qui n'est pas présente dans tous les sous-modules, on peut utiliser

git submodule foreach --recursive "git checkout branchname || true"

Sinon, la commande échouera sur le premier dépôt n'ayant pas la branche spécifiée.

3
YesThatIsMyName