Eu tenho um repositório Git que possui vários submódulos. Como listar os nomes de todos os submódulos após a git submodule init
execução?
O git submodule foreach
comando poderia ecoar os nomes do submódulo, mas isso só funciona depois que eles foram retirados, o que não aconteceu após a etapa init. Há mais etapas na cadeia que precisam acontecer antes que possam ser verificadas, e não quero ter que conectar os nomes dos submódulos ao script.
Existe um comando Git para obter os nomes de todos os submódulos registrados atualmente, mas ainda não verificados?
git
git-submodules
tpg2114
fonte
fonte
git submodule
se comporta como eu esperava que umgit submodule list
comportamento hipotético - eu nunca pensei em verificar o que acontece sem argumentosgit submodule
. (Ainda bem que testei esse link, desde que peguei o link errado 'Share' inicialmente!) #git submodule list
não existia egit submodule help
não ajudou (de acordo com o último, a solução,git submodule
não é um uso válido).paths
,names
e não é interrompido quando contêm caracteres especiais. Eu tentei dar uma resposta para nomes e caminhos que devem ser seguros: stackoverflow.com/a/56912913/3215929Respostas:
Você pode usar o mesmo mecanismo que o
git submodule init
próprio usa, ou seja, observe.gitmodules
. Esses arquivos enumeram cada caminho do sub-módulo e a URL a que se refere.Por exemplo, a partir da raiz do repositório,
cat .gitmodules
imprimirá o conteúdo na tela (supondo que você tenhacat
).Como os arquivos .gitmodule têm o formato de configuração Git, você pode usar o git config para analisar esses arquivos:
Mostraria todas as entradas do submódulo e com
você apenas obteria o próprio caminho do submódulo.
fonte
cat .gitmodules
na raiz do repositório ...awk
peça falhará se você tiver espaços no caminho do submódulo.awk
falha para submódulos com espaços! O comando deve lergit config -z --file .gitmodules --get-regexp '\.path$' | sed -nz 's/^[^\n]*\n//p' | tr '\0' '\n'
(você precisa de um modernosed
com-z
). Isso falha nos caminhos com Novas Linhas (eles podem ser criados comgit mv
). Se você quiser se proteger contra isso, deixe o| tr '\0' '\n'
e use algo como... | while IFS='' read -d '' path; do ...
para processamento adicional com o bash. Isso precisa de uma festança moderna que entendaread -d ''
(não esqueça o espaço entre-d
e''
).Você pode usar
git submodule status
ou, opcionalmente,git submodule status --recursive
se desejar mostrar submódulos aninhados.Na documentação do Git:
fonte
git submodule update --init --recursive
para inicializar todo o submódulo.git
comando simples e baseado em nativo sem qualquer ajuda do bash. E essa solução é elegante da maneira que funciona bem em qualquer ponto da cópia de trabalho (mas é claro que os próprios submódulos, para os quais o resultado se aplica diretamente a eles mesmos).git submodule
sem argumentos é o mesmo quegit submodule status
você pode salvar 7 digitando 7 caracteres ;-) #git submodule status --recursive
funcionam, masgit submodule --recursive
não. Esses 7 caracteres compram algo para você. Depende de suas necessidades embora.Para retornar apenas os nomes dos submódulos registrados, você pode usar este comando:
Pense nisso como o
git submodule --list
que não existe.fonte
perl -ne '/^\s*path =\s*(.*)/ and push(@submods, $1); END { print(join("\n", sort(@submods)));}' "$(git rev-parse --show-toplevel)/.gitmodules"
que, comparado a esta resposta (1), funciona a partir de qualquer subdiretório (embora não dentro de um submódulo); (2) classifica os submódulos por nome; e (3) ignora as linhas comentadas nos módulos .git.path
pode estar presente no nome do submódulo (git submodule add https://github.com/commercialhaskell/path.git
). Mas você provavelmente já sabia disso antes. Se você deseja acessar.gitconfig
de qualquer lugar em uma árvore de trabalho ou precisar executá-lo em um--bare
repositório, pode usar algo comogit cat-file -p HEAD:.gitmodules | ...
. Se você precisar consultar o arquivo "faseado", poderá fazê-logit cat-file -p :.gitmodules | ...
, no entanto, isso precisa de um gitindex
para estar presente.O comando a seguir listará os submódulos:
A saída é algo como isto:
Nota: Requer Git 2.7.0 ou superior.
fonte
git ls-files --stage | grep ^160000
(da resposta stackoverflow.com/a/29325219 ) parece produzir o mesmo resultado, portanto, talvez este seja um bom substituto se você precisar ser compatível com gits mais antigos.--
traços de casal emsubmodule--helper
Usar:
Ele listará todos os submódulos no repositório Git especificado.
fonte
git submodule [status]
(observe questatus
está implícito se omitido, portanto é o mesmo).fatal: no submodule mapping found in .gitmodules for path 'bla-bla/foo-bar'
. Primeiro, você deve excluir todos os repositórios internos que ainda não estão submodulados.--recursive
sinalizador, é necessário adicionar explicitamente ostatus
comando:git submodule status --recursive
funciona, masgit submodule --recursive
não.Eu uso isso:
fonte
Percebi que o comando fornecido em resposta a esta pergunta me deu as informações que eu estava procurando:
Nenhum mapeamento de submódulo encontrado no .gitmodule para um caminho que não é um submódulo
fonte
git ls-files --stage | grep 160000 | perl -ne 'chomp;split;print "$_[3]\n"'
.gimodules
ou nada.git/config
. (Eu não sei como isso acontecer, eu tenho o repositório neste estado Foi um engano, de modo solução foi.git rm
.)grep "^160000 "
seria um pouco mais robusto.Se você não se importa de operar apenas em submódulos inicializados, pode usar
git submodule foreach
para evitar a análise de texto.fonte
Você pode usar:
fonte
test (master)
(nome com um espaço seguido por parênteses), que é um nome válido para o sub-módulo . O comando também não pode ser corrigido, porque o git imprimemodule
oumodule (branch)
. E é ainda pior, como esse comando não é de porcelana, portanto a saída do comando pode mudar no futuro sem aviso prévio.Eu uso este:
Saída (caminho + versão):
fonte
Para listar todos os submódulos por nome:
git submodule --quiet foreach --recursive 'echo $name'
fonte
Isso funcionou para mim:
Ele é baseado neste excelente artigo: Entendendo os submódulos do Git
Deve ler
grep ^160000
.fonte
git ls-files --stage | grep ^160000
parece produzir a mesma saída que agit submodule--helper list
da resposta stackoverflow.com/a/40877379👍🏼
fonte
.url
chaves; portanto, outras entradas também podem aparecer (geralmente não existem, mas as coisas acontecem). Você deve usar--local
aqui, porque não deseja ver--global
e--system
configurações. E por último, porque pode ser esquecido, funciona apenas para submódulos, que já estão presentes.git/config
(como depoisgit submodule init
, veja a pergunta).git config
permite especificar um arquivo de configuração.E
.gitmodules
é um arquivo de configuração.Portanto, com a ajuda de " use o espaço como um delimitador com o comando cut ":
Isso listará apenas os caminhos, um por sub-módulo declarado.
Como Tino aponta nos comentários :
Como uma alternativa mais robusta, Tino propõe:
fonte
git submodule add https://github.com/hilbix/bashy.git "sub module"; git mv 'sub module' $'sub\nmodule'
). Veja meu comentário na resposta aceita, que é muito semelhante à sua.Na minha versão do Git [1] , todo submódulo do Git possui a
name
e apath
. Eles não precisam necessariamente ser os mesmos [2] . Obter os dois de maneira confiável, sem verificar primeiro os submódulos (git update --init
), é um pouco complicado de assistente de shell.Obter uma lista do submódulo
names
Não encontrei uma maneira de conseguir isso usando
git config
ou qualquer outrogit
comando. Portanto, estamos de volta à regex em.gitmodules
(super feia). Mas parece ser um pouco seguro, poisgit
limita o possível espaço de código permitido para o submódulonames
. Além disso, como você provavelmente deseja usar esta lista para processamento de shell adicional, a solução abaixo separa as entradas comNULL
-bytes (\0
).E no seu script:
Nota :
read -rd ''
requerbash
e não funcionarásh
.Obter uma lista do submódulo
paths
Na minha abordagem que eu tente não para processar a saída
git config --get-regexp
comawk
,tr
,sed
, ... mas em vez passá-lo a zero bytes separados de volta paragit config --get
. Isso é para evitar problemas com novas linhas, espaços e outros caracteres especiais (por exemplo, Unicode) no submódulopaths
. Além disso, como você provavelmente deseja usar esta lista para processamento de shell adicional, a solução abaixo separa as entradas comNULL
-bytes (\0
).Por exemplo, em um script Bash, você pode:
Nota :
read -rd ''
requerbash
e não funcionarásh
.Notas de rodapé
[1] versão Git
[2] Submódulo com divergentes
name
epath
Configure o repositório de teste:
Mova o submódulo para criar
name
epath
divergir:Teste
Configure o repositório de teste:
.gitmodules
:Obter lista de submódulo
names
Obter lista de submódulo
paths
fonte
Se não houver nenhum
.gitmodules
arquivo, mas existir uma configuração de submódulos em.git/modules/
:fonte
Aqui está outra maneira de analisar nomes de submodulos Git de .gitmodules sem a necessidade de configurações IFS sed ou sofisticadas. :-)
fonte