É possível ter submódulos rasos? Eu tenho um superprojeto com vários submódulos, cada um com uma longa história, por isso fica desnecessariamente grande arrastando toda essa história.
Tudo o que eu encontrei é esse tópico sem resposta .
Devo apenas hackear o git-submodule para implementar isso?
git
git-submodules
Mauricio Scheffer
fonte
fonte
git submodule add/update
" agora pode clonar os repositórios do submódulo superficialmente! Veja minha resposta abaixoRespostas:
Novo no próximo git1.8.4 (julho de 2013) :
(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 :
Isso significa que isso funciona:
Com:
atwyman acrescenta nos comentários :
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)MVG aponta nos comentários para confirmar fb43e31 (git 2.9, fev 2016)
Atualização em agosto de 2016 (3 anos depois)
Com o Git 2.10 (terceiro trimestre de 2016), você poderá fazer
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)No entanto, Ciro Santilli acrescenta nos comentários (e detalhes em sua resposta )
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)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)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.Consulte commit 4f3e57e , commit 10c64a0 (02 dez 2019) por Jonathan Tan (
jhowtan
) .(Mesclado por Junio C Hamano -
gitster
- in commit 5dd1d59 , 10 dez 2019)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.
A documentação do submódulo de configuração agora inclui:
fonte
--depth
shoudl também discutem;)uploadpack.allowReachableSHA1InWant
euploadpack.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 para alguns cenários, a saber, se o commit também é uma tag. Vamos esperar e ver..gitmodules
, a--depth 1
opção funciona para filiais que não estão acompanhando o mestre de perto?Os sub-módulos de suporte do Git 2.9.0 raso clone diretamente, então agora você pode simplesmente chamar:
fonte
Seguindo a resposta de Ryan, consegui criar esse script simples que itera todos os submódulos e os clona superficialmente:
fonte
fatal: reference is not a tree: 88fb67b07621dfed054d8d75fd50672fb26349df
para cada submóduloLendo o "fonte" do git-submódulo, parece que ele
git submodule add
pode lidar com submódulos que já têm seus repositórios presentes. Nesse caso...Você deseja garantir que a confirmação necessária esteja no repositório do submódulo, portanto, defina uma profundidade apropriada.
Editar: você pode se safar de vários clones de submódulos manuais, seguidos por uma única atualização:
fonte
Resumo do comportamento incorreto / inesperado / irritante no Git 2.14.1
shallow = true
em.gitmodules
afeta apenasgit clone --recurse-submodules
se oHEAD
deste sub-módulo remoto aponta para o necessário cometer, mesmo se o alvo cometer é apontado por um ramo, e mesmo se você colocarbranch = mybranch
sobre o.gitmodules
bem.Script de teste local . O mesmo comportamento no GitHub 2017-11, onde
HEAD
é controlado pela configuração padrão de repo branch:git clone --recurse-submodules --shallow-submodules
falhará se a cometer é nem referenciado por um ramo ou etiqueta com uma mensagem:error: Server does not allow request for unadvertised object
.Script de teste local . Mesmo comportamento no GitHub:
Também perguntei na lista de endereços: https://marc.info/?l=git&m=151863590026582&w=2 e a resposta foi:
Teste TODO:
allowReachableSHA1InWant
.fonte
git clone --recursive
que buscam apenas essa confirmação específica.Os locais canônicos dos seus submódulos são remotos? Se sim, você está bem em cloná-los uma vez? Em outras palavras, você deseja os clones superficiais apenas porque está sofrendo a largura de banda desperdiçada dos (re) clones freqüentes de submódulos?
Se você deseja que clones rasos salvem espaço em disco local, a resposta de Ryan Graham parece ser um bom caminho. Clone manualmente os repositórios para que sejam rasos. Se você acha que seria útil, adapte-o
git submodule
para apoiá-lo. Envie um email para a lista perguntando sobre isso (conselhos para implementá-lo, sugestões na interface etc.). Na minha opinião, o pessoal apoia bastante os colaboradores em potencial que desejam sinceramente aprimorar o Git de maneiras construtivas.Se você concorda em executar um clone completo de cada submódulo (além de buscar mais tarde para mantê-los atualizados), tente usar a
--reference
opção degit submodule update
(está no Git 1.6.4 e posterior) para se referir aos armazenamentos de objetos locais (por exemplo, faça--mirror
clones dos repositórios canônicos de submódulos e use--reference
em seus submódulos para apontar para esses clones locais). Apenas certifique-se de ler sobregit clone --reference
/git clone --shared
antes de usar--reference
. O único problema provável com os espelhos de referência seria se eles acabassem buscando atualizações sem avanço rápido (embora você possa ativar reflogs e expandir suas janelas de expiração para ajudar a reter quaisquer commits abandonados que possam causar um problema). Você não deve ter nenhum problema, desde queSe você optar por algo assim e houver alguma chance de levar submissões locais do submódulo em suas árvores de trabalho, provavelmente seria uma boa ideia criar um sistema automatizado que garanta que os objetos críticos referenciados pelos submódulos retirados não sejam deixado pendurado nos repositórios espelhados (e, se houver algum, copia-os para os repositórios que precisam deles).
E, como
git clone
diz a página de manual, não use--reference
se você não entender essas implicações.Como alternativa, em vez de
--reference
, você pode usar os clones de espelho em combinação com a funcionalidade de ligação direta padrãogit clone
usando espelhos locais como a fonte para seus submódulos. Nos novos clones de superprojetogit submodule init
, edite os URLs do submódulo.git/config
para apontar para os espelhos locais e, em seguida,git submodule update
. Você precisaria reclinar todos os submódulos de check-out existentes para obter os hardlinks. Você economizaria largura de banda baixando apenas uma vez nos espelhos e depois localizando-os localmente nos sub-módulos com check-out. A vinculação física pouparia espaço em disco (embora as buscas tendam a se acumular e a duplicar-se em várias instâncias dos armazenamentos de objetos dos sub-módulos de check-out; você pode periodicamente reclinar os sub-módulos de check-out dos espelhos para recuperar a economia de espaço em disco fornecida por ligação direta).fonte
Eu criei uma versão um pouco diferente, para quando ela não está sendo executada no limite, o que nem todos os projetos fazem. As adições de sub-módulo padrão não funcionaram nem o script acima. Então, eu adicionei uma pesquisa de hash para a tag ref e, se ela não tiver uma, ela volta ao clone completo.
fonte
Referência a Como clonar repositório git com revisão / conjunto de alterações específicas?
Eu escrevi um script simples que não tem problema quando a referência do sub-módulo está longe do mestre
Esta declaração buscará a versão referenciada do submódulo.
É rápido, mas você não pode confirmar sua edição no submódulo (você deve buscá-lo antes de https://stackoverflow.com/a/17937889/3156509 )
na íntegra:
fonte
O clone raso de um submódulo é perfeito porque eles capturam instantaneamente uma revisão / conjunto de alterações específico. É fácil baixar um zip do site, então tentei um script.
git submodule deinit --all -f
limpa a árvore do submódulo que permite que o script seja reutilizável.git submodule
recupera o 40 char sha1 seguido por um caminho que corresponde ao mesmo em.gitmodules
. Eu uso o perl para concatenar essas informações, delimitadas por dois pontos, e depois emprego a transformação de variáveis para separar os valores emmysha
emysub
.Essas são as chaves críticas porque precisamos do sha1 para baixar e do caminho para correlacionar os
url
módulos .git.Dada uma entrada típica do sub-módulo:
myurl
as teclaspath =
então parecem 2 linhas depois para obter o valor. Este método pode não funcionar de forma consistente e requer refinamento. O URL grep retira todas as.git
referências de tipo restantes , correspondendo à última/
e qualquer coisa até a.
.mydir
émysub
menos uma final/name
que seria pelo diretório que levava ao nome do submódulo.A seguir está um
wget
com o formato de url de arquivo zip para download. Isso pode mudar no futuro.Descompacte o arquivo no
mydir
qual seria o subdiretório especificado no caminho do sub-módulo. A pasta resultante será o último elemento dourl
-sha1
.Verifique se o subdiretório especificado no caminho do submódulo existe e remova-o para permitir renomear a pasta extraída.
mv
renomeie a pasta extraída que contém nosso sha1 para o caminho correto do sub-módulo.Exclua o arquivo zip baixado.
Init do submódulo
Isso é mais uma prova de conceito do WIP do que uma solução. Quando funciona, o resultado é um clone superficial de um submódulo em um conjunto de alterações especificado.
Se o repositório voltar a hospedar um submódulo em uma confirmação diferente, execute novamente o script para atualizar.
A única vez que um script como esse seria útil é para a construção local não colaborativa de um projeto de origem.
fonte