Liste des submodules dans un dépôt Git
J'ai un dépôt Git qui a plusieurs submodules en elle. Comment puis-je liste les noms de tous les submodules après git submodule init
a été exécuté?
La git submodule foreach
commande pourrait répéter le nom de la sous-module, mais qui ne fonctionne qu'une fois qu'ils ont été vérifiés qui n'est pas arrivé après l'initialisation de l'étape. Il y a plusieurs étapes dans la chaîne qui doivent se produire avant qu'ils puissent être vérifié, et je ne veux pas de fils noms des submodules dans le script.
Donc, il y a une commande Git pour obtenir les noms de tous les inscrits, mais pas encore vérifié submodules?
- Super idiot qu'il ne l'est pas, mais Sandeep réponse, montre que
git submodule
se comporte comme j'attend un hypothétiquegit submodule list
à se comporter - je n'ai jamais pensé à vérifier ce qui se passe avec aucun des arguments àgit submodule
. (Heureux, j'ai testé le lien, depuis que j'ai attrapé le mal "Partager" le lien d'abord!) - Je suis venu ici parce que
git submodule list
n'existait pas etgit submodule help
n'aide pas (selon ce dernier, la solution,git submodule
, n'est pas valide d'utilisation). - La plupart des réponses (y compris les acceptée, un) liste des sous-module
paths
, pasnames
et rompre lorsqu'ils contiennent des caractères spéciaux. J'ai essayé de donner une réponse à la fois les noms et les chemins d'accès qui devrait être à l'abri: stackoverflow.com/a/56912913/3215929
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le même mécanisme que
git submodule init
utilise lui-même, à savoir, regardez.gitmodules
. Ce fichier répertorie chaque sous-module de chemin d'accès et l'URL il se réfère.Par exemple, à partir de la racine du référentiel,
cat .gitmodules
permettra d'imprimer le contenu de l'écran (en supposant que vous avezcat
).Parce que .gitmodule fichiers ont le Git format de configuration, vous pouvez utiliser la commande git config pour analyser ces fichiers:
Serait de vous montrer tous les sous-module d'entrées, et avec
vous n'aurez que le sous-module chemin lui-même.
cat .gitmodules
dans la racine du référentiel...awk
partie d'échec si vous avez des espaces dans le sous-module de chemin.--list
? Comme:git config --file .gitmodules -l
awk
échoue pour submodules avec des espaces! La commande doit liregit config -z --file .gitmodules --get-regexp '\.path$' | sed -nz 's/^[^\n]*\n//p' | tr '\0' '\n'
(vous avez besoin d'un modernesed
avec-z
). Cette échoue pour chemins avec des sauts de ligne dans leur (ils peuvent être créés avecgit mv
). Si vous voulez être sûr de contre ces, de retirer le| tr '\0' '\n'
et d'utiliser quelque chose comme... | while IFS='' read -d '' path; do ...
pour la poursuite du traitement avec bash. Il a besoin d'un moderne bash qui comprendread -d ''
(ne pas oublier l'espace entre-d
et''
).Vous pouvez utiliser
git submodule status
ou éventuellementgit submodule status --recursive
si vous voulez montrer imbriquée submodules.Du Git de la documentation:
git submodule update --init --recursive
d'initialiser tous les sous-module.git
commande sans aucune aide de bash. Et cette solution est élégante dans la façon dont il fonctionne bien à tout point de la copie de travail (mais les submodules eux-mêmes bien sûr, pour qui le résultat s'applique directement à eux-mêmes).git submodule
sans argument est le même quegit submodule status
, de sorte que vous pouvez enregistrer vous-même en tapant 7 caractères 😉Renvoyer simplement le nom de la personne inscrite submodules, vous pouvez utiliser cette commande:
Pense que
git submodule --list
qui n'existe pas.perl -ne '/^\s*path =\s*(.*)/ and push(@submods, $1); END { print(join("\n", sort(@submods)));}' "$(git rev-parse --show-toplevel)/.gitmodules"
qui par rapport à cette réponse (1) travaux de n'importe quel sous-répertoire (mais pas à l'intérieur d'un sous-module); (2) trie les submodules par son nom; et (3) ignore les lignes commentées dans .gitmodules.path
pourrait être présent dans le sous-module nom (git submodule add https://github.com/commercialhaskell/path.git
). Mais vous le saviez sûrement déjà avant. Si vous souhaitez accéder à.gitconfig
à partir de n'importe où dans un worktree ou besoin d'exécuter ce dans un--bare
référentiel, vous pouvez utiliser quelque chose commegit cat-file -p HEAD:.gitmodules | ...
. Si vous avez besoin de se référer à la "mise en scène" du fichier, vous pouvez le fairegit cat-file -p :.gitmodules | ...
, cependant il a besoin d'un gitindex
d'être présent.La commande suivante liste les submodules:
La sortie est quelque chose comme ceci:
Remarque: Il nécessite Git 2.7.0 ou au-dessus.
git ls-files --stage | grep ^160000
(à partir de Répondre à stackoverflow.com/a/29325219) semble produire le même résultat, donc c'est peut-être une bonne alternative si vous avez besoin d'être compatible avec les anciennes gits.--
double tiret danssubmodule--helper
Utilisation:
Il fournira la liste de tous les submodules dans le dépôt Git.
git submodule [status]
(notez questatus
est implicite si omis, donc c'est la même).fatal: no submodule mapping found in .gitmodules for path 'bla-bla/foo-bar'
. Vous devez d'abord supprimer tous les intérieurs des dépôts qui ne sont pas submoduled encore.J'utilise ceci:
J'ai remarqué que la commande fournie dans la réponse à cette question m'a donné les renseignements que je cherchais:
Pas de sous-module de cartographie trouvé dans .gitmodule pour un chemin qui n'est pas un sous-module
git ls-files --stage | grep 160000 | perl -ne 'chomp;split;print "$_[3]\n"'
.gimodules
ou quoi que ce soit dans.git/config
. (Je ne suis pas sûr de savoir comment y arriver, j'ai eu le référentiel dans cet état. C'était une erreur, si la solution étaitgit rm
.)grep "^160000 "
serait un peu plus robuste.Si vous n'avez pas l'esprit ne fonctionne que sur initialisé submodules, vous pouvez utiliser
git submodule foreach
pour éviter de texte de l'analyse.Vous pouvez utiliser:
test (master)
(nom avec un espace suivi par des parenthèses) , qui est valide sous-module nom. La commande ne peut pas être résolu, parce que git imprimemodule
oumodule (branch)
. Et c'est encore pire, que cette commande n'est pas porcellain, de sorte que la sortie de la commande peut changer dans l'avenir sans préavis.J'utilise celui-ci:
De sortie (chemin + version):
À la liste de tous les submodules par nom:
git submodule --quiet foreach --recursive 'echo $name'
Cela a fonctionné pour moi:
Il est basé sur cet excellent article: La Compréhension Des Submodules
Elle doit lire
grep ^160000
.git ls-files --stage | grep ^160000
semble produire le même résultat quegit submodule--helper list
de répondre à stackoverflow.com/a/40877379.url
touches, de sorte que les autres entrées peuvent se présenter ainsi (habituellement il n'y a aucun, mais de la merde qui se passe). Vous devez utiliser--local
ici, parce que vous ne voulez pas voir--global
et--system
paramètres. Et dernière remarque, parce qu'il peut être négligé, il ne fonctionne que pour les submodules, qui sont déjà présents dans.git/config
(comme aprèsgit submodule init
, voir la question).git config
permet de spécifier un fichier de configuration.Et
.gitmodules
est un fichier de config.Ainsi, avec l'aide de "l'utilisation de l'espace comme séparateur avec la commande cut":
Qui liste uniquement les chemins, l'un par déclarée en sous-module.
Comme Tino souligne dans les commentaires:
Comme une alternative plus robuste, Tino propose:
git submodule add https://github.com/hilbix/bashy.git "sub module"; git mv 'sub module' $'sub\nmodule'
). Voir mon commentaire à la accepté de répondre qui est très semblable à la vôtre.Dans ma version de Git [1], tous Git sous-module a un
name
et unpath
. Ils n'ont pas nécessairement être la même [2]. Avoir à la fois de manière fiable, sans vérifier les submodules première (git update --init
), est un peu difficile de shell de sorcellerie.Obtenir une liste de sous-module
names
Je n'ai pas trouver un moyen de réaliser cela à l'aide de
git config
ou de tout autregit
de commande. Par conséquent, nous sommes de retour à la regex sur.gitmodules
(super moche). Mais il semble être un peu fort depuisgit
limites du possible code de l'espace autorisé pour les sous-modulenames
. En outre, puisque vous voudrez probablement utiliser cette liste pour de plus amples shell de traitement, la solution ci-dessous des entrées séparées avecNULL
-octets (\0
).Et dans votre script:
Note:
read -rd ''
nécessitebash
et ne fonctionne pas avecsh
.Obtenir une liste de sous-module
paths
Dans mon approche, j'essaie pas pour traiter la sortie de
git config --get-regexp
avecawk
,tr
,sed
, ... mais au lieu de le passer de zéro octet séparés dos àgit config --get
. C'est pour éviter les problèmes avec les sauts de ligne, les espaces et autres caractères spéciaux (par exemple Unicode) dans le sous-modulepaths
. En outre, puisque vous voudrez probablement utiliser cette liste pour de plus amples shell de traitement, la solution ci-dessous des entrées séparées avecNULL
-octets (\0
).Par exemple, dans un script Bash, vous pouvez:
Note:
read -rd ''
nécessitebash
et ne fonctionne pas avecsh
.Notes de bas de page
[1] de version Git
[2] sous-module avec divergentes
name
etpath
Configurer dépôt de test:
Déplacer sous module pour faire
name
etpath
divergent:Tests
Configurer dépôt de test:
.gitmodules
:Obtenir la liste des sous-module
names
Obtenir la liste des sous-module
paths
Si il n'est pas tout
.gitmodules
fichier, mais un submodules configuration existe dans.git/modules/
:Voici une autre façon d'analyser Git sous-module noms de .gitmodules sans la nécessité pour les sed ou de fantaisie FI paramètres. 🙂