Liste des sous-modules dans un référentiel Git

J’ai un repository Git qui contient plusieurs sous-modules. Comment puis-je lister les noms de tous les sous-modules après l’exécution de git submodule init ?

La commande git submodule foreach pourrait faire écho aux noms du sous-module, mais cela ne fonctionne qu’une fois qu’ils ont été extraits, ce qui n’est pas arrivé après l’étape d’initialisation. Il y a d’autres étapes dans la chaîne qui doivent se produire avant de pouvoir être extraites, et je ne veux pas avoir à câbler les noms des sous-modules dans le script.

Existe-t-il une commande Git pour obtenir les noms de tous les sous-modules actuellement enregistrés, mais pas encore extraits?

Vous pouvez utiliser le même mécanisme que git submodule init utilise lui-même, à savoir, regardez les .gitmodules . Ce fichier énumère chaque chemin de sous-module et l’URL à laquelle il fait référence.

Par exemple, à partir de la racine du référentiel, cat .gitmodules imprimera le contenu à l’écran (en supposant que vous ayez un cat ).

Les fichiers .gitmodule ayant le format de configuration Git, vous pouvez utiliser git config pour parsingr ces fichiers:

 git config --file .gitmodules --name-only --get-regexp path 

Vous montrerait toutes les entrées de sous-modules, et avec

 git config --file .gitmodules --get-regexp path | awk '{ print $2 }' 

vous n’obtiendrez que le chemin du sous-module lui-même.

Vous pouvez utiliser l’ git submodule status ou, en option, l’ git submodule status --recursive si vous souhaitez afficher des sous-modules nesteds.

À partir des documents GIT SCM:

Affiche le statut des sous-modules. Cela affichera le SHA-1 de la validation actuellement extraite pour chaque sous-module, ainsi que le chemin du sous-module et le résultat de la description de git pour le SHA-1. Chaque SHA-1 sera préfixé avec – si le sous-module n’est pas initialisé, + si la validation du sous-module actuellement extrait ne correspond pas au SHA-1 trouvé dans l’index du référentiel contenant et U si le sous-module a des conflits de fusion.

Pour ne retourner que les noms des sous-modules enregistrés, vous pouvez utiliser cette commande:

 grep path .gitmodules | sed 's/.*= //' 

Pensez-y comme git submodule --list qui n’existe pas.

La commande suivante listera les sous-modules:

 git submodule--helper list 

La sortie est quelque chose comme ceci:

     

Remarque: Nécessite git 2.7.0 ou supérieur.

J’ai remarqué que la commande fournie dans une réponse à cette question m’a donné les informations que je cherchais:

Aucun mappage de sous-module trouvé dans .gitmodule pour un chemin qui n’est pas un sous-module

 git ls-files --stage | grep 160000 

J’utilise ceci:

 git config --list|egrep ^submodule 

Je peux voir que la réponse a été sélectionnée mais, pour quiconque atteint cette page:

 $ git submodule 

listera tous les sous-modules du repo git spécifié.

À votre santé

Vous pouvez utiliser:

 git submodule | awk '{ print $2 }' 

J’utilise celui-ci:

 git submodule status | cut -d' ' -f3-4 

Sortie (chemin + version):

 tools/deploy_utils (0.2.4) 

Juste les chemins de sousmodule s’il vous plait, madame …

 git config --list | grep \^submodule | cut -f 2 -d . 
 Vendor/BaseModel Vendor/ObjectMatcher Vendor/OrderedDictionary Vendor/_ObjC Vendor/XCodeHelpers 

👍🏼

Cela a fonctionné pour moi:

 git ls-files --stage | grep ^160000 

Basé sur cet excellent article: http://www.speirs.org/blog/2009/5/11/understanding-git-submodules.html

Edit: Il faut lire grep ^160000

git config permet de spécifier un fichier de configuration.
Et .gitmodules est un fichier de configuration.

Donc, avec l’aide de ” use space as delimiter with cut command “:

 git config --file=.gitmodules --get-regexp ^^submodule.*\.path$ | cut -d " " -f 2 

Cela ne listera que les chemins, un par sous-module déclaré.

Comme le souligne Tino dans les commentaires :

  • Cela échoue pour les sous-modules avec des espaces .
  • les chemins de sous-modules peuvent contenir des nouvelles lignes , comme dans

     git submodule add https://github.com/hilbix/bashy.git "sub module" git mv 'sub module' $'sub\nmodule' 

Comme alternative plus robuste, Tino propose:

 git config -z --file .gitmodules --get-regexp '\.path$' | \ sed -nz 's/^[^\n]*\n//p' | \ tr '\0' '\n' 

Pour les chemins avec des nouvelles lignes (ils peuvent être créés avec git mv ), laissez de côté le | tr '\0' '\n' | tr '\0' '\n' et utilisez quelque chose comme ... | while IFS='' read -d '' path; do ... ... | while IFS='' read -d '' path; do ... ... | while IFS='' read -d '' path; do ... pour un traitement ultérieur avec bash.
Cela nécessite un bash moderne qui comprend read -d '' (n’oubliez pas l’espace entre -d and '' ).

Si cela ne vous dérange pas d’utiliser uniquement des sous-modules initialisés, vous pouvez utiliser git submodule foreach pour éviter l’parsing de texte.

 git submodule foreach --quiet 'echo $name' 

Pour lister tous les sous-modules avec le chemin

git submodule --quiet foreach --recursive 'echo $name'

Si aucun .gitmodules, mais des sous-modules de configuration existent en .git / modules /

 find .git/modules/ -name config -exec grep url {} \;