Novo no próximo git1.8.4 (julho de 2013) :
" git submodule update
" pode opcionalmente clonar os repositórios do submódulo superficialmente.
(E o git 2.10 Q3 2016 permite gravar isso com git config -f .gitmodules submodule.<name>.shallow true
.
Veja o final desta resposta)
Consulte commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Adicione a --depth
opção aos comandos add e update do "submodule git", que são passados ao comando clone. Isso é útil quando os submódulos são enormes e você não está realmente interessado em nada além da confirmação mais recente.
Os testes são adicionados e alguns ajustes de indentação foram feitos para estar em conformidade com o restante do arquivo de teste em "a atualização do sub-módulo pode manipular links simbólicos no pwd".
Assinado por: Fredrik Gustafsson <iveqy@iveqy.com>
Aceito por: Jens Lehmann<Jens.Lehmann@web.de>
Isso significa que isso funciona:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
Com:
--depth::
Esta opção é válida para add
e update
comandos.
Crie um clone 'superficial' com um histórico truncado para o número especificado de revisões.
atwyman acrescenta nos comentários :
Tanto quanto sei, essa opção não é utilizável para submódulos que não acompanham de master
perto. Se você definir a profundidade 1, submodule update
poderá ter êxito apenas se o submódulo que você deseja for o mais recente mestre. Caso contrário, você recebe " fatal: reference is not a tree
" .
Isso é verdade.
Ou seja, até o git 2.8 (março de 2016). Com o 2.8, ele submodule update --depth
tem mais uma chance de obter sucesso, mesmo que o SHA1 esteja diretamente acessível a partir de um dos HEADs de repositório remoto.
Veja commit fb43e31 (24 de fevereiro de 2016) por Stefan Beller ( stefanbeller
) .
Ajudado por: Junio C Hamano ( gitster
) .
(Mesclado por Junio C Hamano - gitster
- na confirmação 9671a76 , 26 de fevereiro de 2016)
submódulo: tente mais difícil buscar o sha1 necessário, buscando diretamente o sha1
Ao revisar uma alteração que também atualiza um submódulo no Gerrit, uma prática comum de revisão é baixar e escolher o patch localmente para testá-lo.
No entanto, ao testá-lo localmente, o ' git submodule update
' pode falhar ao buscar o submódulo correto sha1, pois o commit correspondente no submódulo ainda não faz parte do histórico do projeto, mas também é apenas uma alteração proposta.
Se $sha1
não fez parte da busca padrão, tentamos buscá-la $sha1
diretamente . Alguns servidores, no entanto, não oferecem suporte à busca direta pelo sha1, o que leva git-fetch
à falha rápida.
Nós podemos falhar aqui, pois o sha1 ainda ausente levaria a uma falha mais tarde na fase de checkout, de qualquer maneira, então falhar aqui é o melhor possível.
MVG aponta nos comentários para confirmar fb43e31 (git 2.9, fev 2016)
Parece-me que o commit fb43e31 solicita o commit ausente pelo ID SHA1, portanto as configurações uploadpack.allowReachableSHA1InWant
e uploadpack.allowTipSHA1InWant
no servidor provavelmente afetarão se isso funciona.
Eu escrevi um post na lista git hoje , apontando como o uso de submódulos rasos poderia funcionar melhor em alguns cenários, a saber, se o commit também é uma tag.
Vamos esperar e ver.
Eu acho que essa é uma razão pela qual fb43e31 fez a busca para um SHA1 específico um fallback após a busca para a ramificação padrão.
No entanto, no caso de “--ththth 1”, acho que faria sentido abortar cedo: se nenhum dos refs listados corresponder ao solicitado, e a solicitação pelo SHA1 não for suportada pelo servidor, então não há sentido em buscando qualquer coisa, pois não seremos capazes de satisfazer o requisito do submódulo de qualquer maneira.
Atualização em agosto de 2016 (3 anos depois)
Com o Git 2.10 (terceiro trimestre de 2016), você poderá fazer
git config -f .gitmodules submodule.<name>.shallow true
Consulte " Sub-módulo Git sem peso extra " para obter mais informações.
Git 2.13 (Q2 2017) adiciona no commit 8d3047c (19 de abril de 2017) por Sebastian Schuberth ( sschuberth
) .
(Mesclado por Sebastian Schuberth - sschuberth
- no commit 8d3047c , 20 de abril de 2017)
um clone deste submódulo será executado como um clone superficial (com uma profundidade de histórico de 1)
No entanto, Ciro Santilli acrescenta nos comentários (e detalhes em sua resposta )
shallow = true
em .gitmodules
só afeta a referência monitorado pelo chefe do controle remoto quando usar --recurse-submodules
, mesmo se o alvo cometer é apontado por um ramo, e mesmo se você colocar branch = mybranch
sobre o .gitmodules
bem.
O Git 2.20 (quarto trimestre de 2018) aprimora o suporte ao submódulo, que foi atualizado para ler no blob HEAD:.gitmodules
quando o .gitmodules
arquivo estiver ausente na árvore de trabalho.
Consulte commit 2b1257e , commit 76e9bdc (25 de outubro de 2018) e commit b5c259f , commit 23dd8f5 , commit b2faad4 , commit 2502ffc , commit 996df4d , commit d1b13df , commit 45f5ef3 , commit bcbc780 (05 out 2018) por Antonio Ospite ( ao2
) .
(Mesclado por Junio C Hamano - gitster
- in commit abb4824 , 13 de novembro de 2018)
submodule
: suporta leitura .gitmodules
quando não está na árvore de trabalho
Quando o .gitmodules
arquivo não estiver disponível na árvore de trabalho, tente usar o conteúdo do índice e da ramificação atual.
Isso abrange o caso em que o arquivo faz parte do repositório, mas, por algum motivo, não é retirado, por exemplo, devido a uma verificação esparsa.
Isso torna possível usar pelo menos os git submodule
comandos ' ' que lêem o gitmodules
arquivo de configuração sem preencher totalmente a árvore de trabalho.
Escrever para .gitmodules
ainda exigirá que o arquivo esteja com check-out, portanto, verifique-o antes de ligar config_set_in_gitmodules_file_gently
.
Adicione uma verificação semelhante também git-submodule.sh::cmd_add()
para antecipar a eventual falha do git submodule add
comando " " quando .gitmodules
não for gravável com segurança; isso evita que o comando deixe o repositório em um estado falso (por exemplo, o repositório do submódulo foi clonado, mas .gitmodules
não foi atualizado porque config_set_in_gitmodules_file_gently
falhou).
Além disso, como config_from_gitmodules()
agora acessa o armazenamento de objetos global, é necessário proteger todos os caminhos de código que chamam a função contra acesso simultâneo ao armazenamento de objetos global.
Atualmente, isso só acontece em builtin/grep.c::grep_submodules()
, portanto, chame
grep_read_lock()
antes de chamar o código que envolve config_from_gitmodules()
.
NOTA: há um caso raro em que esse novo recurso ainda não funciona corretamente: submódulos aninhados sem .gitmodules
na árvore de trabalho.
Nota: O Git 2.24 (quarto trimestre de 2019) corrige um possível segfault ao clonar um submódulo superficial.
Veja commit ddb3c85 (30 set 2019) por Ali Utku Selen ( auselen
) .
(Mesclado por Junio C Hamano - gitster
- in commit 678a9ca , 09 out 2019)
O Git 2.25 (primeiro trimestre de 2020) esclarece a git submodule update
documentação.
Veja commit f0e58b3 (24 Nov 2019) por Philippe Blain ( phil-blain
) .
(Incorporado por Junio C Hamano - gitster
- in commit ef61045 , 05 dez 2019)
doc
: mencionar que 'atualização do sub-módulo git' busca confirmações ausentes
Ajudado por: Junio C Hamano
Ajudado por: Johannes Schindelin
Assinado por: Philippe Blain
' git submodule
update' buscará novas confirmações no submódulo remoto se o SHA-1 registrado no superprojeto não for encontrado . Isso não foi mencionado na documentação.
Aviso: Com o Git 2.25 (primeiro trimestre de 2020), a interação entre " git clone --recurse-submodules
" e o armazenamento de objetos alternativos foi mal projetada.
A documentação e o código foram ensinados a fazer recomendações mais claras quando os usuários veem falhas.
Consulte commit 4f3e57e , commit 10c64a0 (02 dez 2019) por Jonathan Tan ( jhowtan
) .
(Mesclado por Junio C Hamano - gitster
- in commit 5dd1d59 , 10 dez 2019)
submodule--helper
: aconselhar sobre erro alternativo fatal
Assinado por: Jonathan Tan
Acked-by: Jeff King
Ao clonar recursivamente um superprojeto com alguns módulos rasos definidos em seu e .gitmodules
, em seguida, reclonar com " --reference=<path>
", ocorre um erro. Por exemplo:
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
master
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
--reference master master2
falha com:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
Quando uma alternativa calculada a partir da alternativa do superprojeto não puder ser adicionada, seja neste caso ou em outro, informe sobre a submodule.alternateErrorStrategy
configuração da opção de configuração " " e o uso de " --reference-if-able
" em vez de " --reference
" na clonagem.
Isso é detalhado em:
Com o Git 2.25 (primeiro trimestre de 2020), a interação entre o "git clone --recurse-submodules" e o armazenamento de objetos alternativos foi mal projetada.
Doc
: explicar submodule.alternateErrorStrategy
Assinado por: Jonathan Tan
Acked-by: Jeff King
A confirmação 31224cbdc7 (" clone
: a opção recursiva e de referência aciona as alternativas do submódulo", 17/08/2016, Git v2.11.0-rc0 - fusão listada no lote # 1 ) ensinou o Git a suportar as opções de configuração " submodule.alternateLocation
" e " submodule.alternateErrorStrategy
" em um superprojeto .
Se " submodule.alternateLocation
" estiver configurado para " superproject
" em um superprojeto, sempre que um sub-módulo desse superprojeto for clonado, ele calculará o caminho alternativo análogo para esse sub-módulo a partir $GIT_DIR/objects/info/alternates
do superprojeto e fará referência a ele.
A submodule.alternateErrorStrategy
opção " " determina o que acontece se essa alternativa não puder ser referenciada.
No entanto, não está claro que o clone continue como se nenhuma alternativa fosse especificada quando essa opção não estiver configurada para "morrer" (como pode ser visto nos testes em 31224cbdc7 ).
Portanto, documente-o adequadamente.
A documentação do submódulo de configuração agora inclui:
submodule.alternateErrorStrategy::
Especifica como tratar erros com as alternativas para um submódulo conforme calculado via submodule.alternateLocation
.
Os valores possíveis são ignore
, info
, die
.
O padrão é die
.
Observe que se definido como ignore
ou info
e se houver um erro com a alternativa calculada, o clone continuará como se nenhuma alternativa fosse especificada .
git submodule add/update
" agora pode clonar os repositórios do submódulo superficialmente! Veja minha resposta abaixo