Não sei ao certo o que significa o seguinte (na documentação de atualização do submódulo Git ):
... vai fazer a cabeça submódulos ser destacado, a menos que
--rebase
ou--merge
é especificado ...
Como --rebase
/ --merge
muda as coisas?
Meu principal caso de uso é ter vários repositórios centrais, que incorporarei por meio de submódulos em outros repositórios. Eu gostaria de poder melhorar esses repositórios centrais, diretamente em seu local original ou de dentro de seus repositórios de incorporação (aqueles que os usam por meio do submódulo).
- A partir desses submódulos, posso criar ramificações / modificações e usar push / pull como faria em repositórios regulares ou há coisas a serem cautelosas?
- Como eu avançaria o commit do submódulo referenciado de say (tagged) 1.0 para 1.1 (mesmo que o chefe do repositório original já esteja em 2.0), ou escolher qual commit do branch é usado?
git
git-submodules
azul profundo
fonte
fonte
Respostas:
Esta página do GitPro resume bem as consequências de uma atualização do sub-módulo git
Nota de março de 2013:
Como mencionado em " git submódulo mais recente ", um submódulo agora (git1.8.2) pode rastrear uma ramificação.
Veja "
git submodule update --remote
vsgit pull
".A resposta do MindTooth ilustra uma atualização manual (sem configuração local):
Nos dois casos, isso alterará as referências dos submódulos (o gitlink , uma entrada especial no índice do repositório pai ), e você precisará adicionar, confirmar e enviar as referências do repositório principal.
Da próxima vez que você clonar esse repositório pai, ele preencherá os submódulos para refletir essas novas referências SHA1.
O restante desta resposta detalha o recurso clássico do submódulo (referência a um commit fixo , que é o ponto principal da noção de submódulo).
Então, para responder suas perguntas:
Você pode criar uma ramificação e enviar modificações.
AVISO (do Tutorial do Git Submodule ): Sempre publique (envie) a alteração do submódulo antes de publicar (envie) a alteração no superprojeto que o referencia. Se você esquecer de publicar a alteração do submódulo, outros não poderão clonar o repositório.
A página " Entendendo os submódulos " pode ajudar
Juntos, eles triangulam uma revisão específica de um repositório específico, que é registrada em um local específico no seu projeto.
Na página do submódulo git
100% correto: você não pode modificar um submódulo, consulte apenas um de seus commit.
É por isso que, quando você modifica um submódulo de dentro do projeto principal, você:
Um submódulo permite que você desenvolva uma abordagem baseada em componentes , onde o projeto principal se refere apenas a confirmações específicas de outros componentes (aqui "outros repositórios Git declarados como submódulos").
Um submódulo é um marcador (confirmação) para outro repositório Git que não é vinculado pelo ciclo principal de desenvolvimento do projeto: ele (o "outro" repositório Git) pode evoluir independentemente.
Cabe ao projeto principal escolher desse outro repositório qualquer que seja a confirmação necessária.
No entanto, se você quiser, por conveniência , modificar um desses submódulos diretamente do seu projeto principal, o Git permite que você faça isso, desde que você primeiro publique essas modificações do submódulo no repositório original do Git e, em seguida, comprometa seu projeto principal, referindo-se a uma nova versão do referido submódulo.
Mas a idéia principal permanece: referenciar componentes específicos que:
A lista de confirmações específicas às quais você está se referindo no seu projeto principal define sua configuração (é disso que se trata o Gerenciamento de Configurações , englobando apenas o Sistema de Controle de Versão )
Se um componente pudesse realmente ser desenvolvido ao mesmo tempo que o projeto principal (porque qualquer modificação no projeto principal envolveria a modificação do subdiretório e vice-versa), seria um "submódulo" não mais, mas um mesclagem de subárvore (também apresentada na pergunta Transferindo a base de código herdada do cvs para o repositório distribuído ), vinculando o histórico dos dois repositórios Git.
Isso ajuda a entender a verdadeira natureza dos submódulos do Git?
fonte
svn:externals
.git submodule foreach
Para atualizar cada submódulo, você pode chamar o seguinte comando (na raiz do repositório):
Você pode remover a opção -q para seguir todo o processo.
fonte
git submodule update --init --recursive
partir da raiz, ele obterá todos eles recursivamente e os inicializará se ainda não o forem.git submodule update --rebase --remote
Para abordar a opção
--rebase
vs.--merge
Digamos que você tenha o super repositório A e o submódulo B e queira fazer algum trabalho no submódulo B. Você fez sua lição de casa e sabia disso depois de ligar
git submodule update
você está em um estado sem cabeça, portanto é difícil voltar a qualquer confirmação que fizer neste momento. Então, você começou a trabalhar em uma nova ramificação no submódulo B
Enquanto isso, alguém no projeto A decidiu que a versão mais recente e melhor de B é realmente o que A merece. Por hábito, você mescla as alterações mais recentes e atualiza seus submódulos.
Oh não! Você voltou ao estado sem cabeça novamente, provavelmente porque B agora está apontando para o SHA associado à nova dica de B ou a algum outro commit. Se você tivesse:
Agora que a melhor idéia de sempre para B foi reformulada no novo commit, e mais importante, você ainda está no ramo de desenvolvimento de B, e não em um estado decapitado!
(A
--merge
mesclagem será alterada de beforeUpdateSHA para afterUpdateSHA em sua ramificação de trabalho, em vez de reformular suas alterações para afterUpdateSHA.)fonte
O Git 1.8.2 apresenta uma nova opção,,
--remote
que permitirá exatamente esse comportamento. Corridabuscará as alterações mais recentes do upstream em cada submódulo, as reorganizará e verificará a revisão mais recente do submódulo. Como a documentação coloca:
Isso é equivalente à execução
git pull
em cada submódulo, que geralmente é exatamente o que você deseja.(Isso foi copiado desta resposta .)
fonte