321 votes

Lister les submodules dans un dépôt Git

J'ai un dépôt Git qui contient plusieurs sous-modules. Comment puis-je lister les noms de tous les submodules après git submodule init a été exécuté ?

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

Existe-t-il une commande Git permettant d'obtenir les noms de tous les submodules actuellement enregistrés, mais pas encore vérifiés ?

8 votes

C'est idiot que ça ne le fasse pas, mais La réponse de Sandeep montre que git submodule se comporte comme je m'attendais à ce qu'un hypothétique git submodule list pour se comporter - je n'ai jamais pensé à vérifier ce qui se passe avec pas de arguments pour git submodule . (Heureusement que j'ai testé ce lien, car j'avais pris le mauvais lien "Partager" au départ !)

5 votes

Je suis venu ici parce que git submodule list n'existait pas et git submodule help n'a pas aidé (selon ce dernier, la solution, git submodule n'est pas une utilisation valide).

0 votes

La plupart des réponses (y compris celle qui a été acceptée) listent le sous-module paths pas names et se brisent lorsqu'ils contiennent des caractères spéciaux. J'ai essayé de donner une réponse pour les noms et les chemins qui devraient être sûrs : stackoverflow.com/a/56912913/3215929

235voto

Ikke Points 31517

Vous pourriez utiliser le même mécanisme que git submodule init utilise lui-même, à savoir, regarder .gitmodules . Ce fichier énumère le chemin d'accès de chaque 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 avez cat ).

Comme les fichiers .gitmodule ont le format de configuration Git, vous pouvez utiliser git config pour analyser ces fichiers :

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

vous montrerait toutes les entrées du sous-module, et avec

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

vous n'obtiendriez que le chemin du sous-module lui-même.

0 votes

Mais ça n'imprime rien sur la console.

3 votes

@IgorGanapolsky - vous pouvez imprimer sur la console, si vous le faites cat .gitmodules dans le dépôt Root...

1 votes

En awk échoue si vous avez des espaces dans le chemin du sous-module.

188voto

Jon Koops Points 606

Vous pouvez utiliser git submodule status ou éventuellement git submodule status --recursive si vous souhaitez afficher les sous-modules imbriqués.

Dans la documentation de Git :

Afficher l'état des sous-modules. Ceci imprimera le SHA-1 du du commit actuellement extrait pour chaque sous-module, ainsi que le chemin du sous-module et la sortie de git describe pour le SHA-1. Chaque SHA-1 sera préfixé par - si le submodule n'est pas initialisé, + si le commit du sous-module actuellement extrait ne correspond pas à l'empreinte SHA-1 trouvé dans l'index du référentiel contenant et U si le sous-module a des conflits de fusion.

5 votes

Il suffit de courir git submodule update --init --recursive pour initialiser tous les sous-modules.

3 votes

@IgorGanapolsky vient de lire le commentaire de Stefaan : ce genre de commandes ne ne fonctionne pas si les sous-modules ne sont pas encore initialisés . Pas de sortie = pas de sous-module (liste vide).

7 votes

Il faut absolument le marquer comme meilleure réponse pour avoir utilisé une méthode simple et native git -sans l'aide de bash. Et cette solution est élégante en ce sens qu'elle fonctionne bien en tout point de la copie de travail (sauf les submodules eux-mêmes bien sûr, pour lesquels le résultat s'applique directement à eux-mêmes).

63voto

mholm815 Points 500

Pour retourner uniquement les noms des submodules enregistrés, vous pouvez utiliser cette commande :

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

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

3 votes

Au lieu de cela, utilisez perl -ne '/^\s*path =\s*(.*)/ and push(@submods, $1); END { print(join("\n", sort(@submods)));}' "$(git rev-parse --show-toplevel)/.gitmodules" qui, comparé à cette réponse, (1) fonctionne à partir de n'importe quel sous-répertoire (mais pas à l'intérieur d'un submodule) ; (2) trie les submodules par nom ; et (3) ignore les lignes commentées dans .gitmodules.

7 votes

Et en plus, c'est mémorable !

2 votes

Notez que cette façon de faire est très peu soignée, car path peut être présent dans le nom du sous-module ( git submodule add https://github.com/commercialhaskell/path.git ). Mais vous le saviez probablement déjà auparavant. Si vous voulez accéder à .gitconfig à partir de n'importe quel endroit d'un arbre de travail ou si vous avez besoin de l'exécuter dans un système de gestion de l'information. --bare vous pouvez utiliser quelque chose comme git cat-file -p HEAD:.gitmodules | ... . Si vous avez besoin de faire référence au fichier "staged", vous pouvez le faire de la manière suivante git cat-file -p :.gitmodules | ... mais cela nécessite un git index pour être présent.

19voto

Robert Sjödahl Points 151

J'utilise ceci :

git config --list|egrep ^submodule

1 votes

@IgorGanapolsky vient de lire le commentaire de Stefaan : Cela ne fonctionne pas si les sous-modules ne sont pas encore initialisés. . Pas de sortie = pas de sous-module (liste vide).

0 votes

C'est exactement ce dont j'avais besoin. Il montre les sous-dossiers des submodules et les urls de leurs remotes.

18voto

Max Cantor Points 4486

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

Aucune correspondance de sous-module trouvée dans .gitmodule pour un chemin qui n'est pas un sous-module.

git ls-files --stage | grep 160000

0 votes

Cette réponse est agréable et propre, y a-t-il des inconvénients par rapport à La réponse de mholm815 analyse des .gitmodules ?

0 votes

BTW, si vous voulez juste les noms des submodules, utilisez git ls-files --stage | grep 160000 | perl -ne 'chomp;split;print "$_[3]\n"'

0 votes

Cela a fonctionné pour moi puisque je n'avais pas .gimodules ou quoi que ce soit dans .git/config . (Je ne sais pas comment c'est arrivé, j'ai obtenu le référentiel dans cet état. C'était une erreur, donc la solution était git rm .)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X