como exatamente o trabalho do submódulo git

O arquivo .gitmodule especifica apenas a URL do repository do módulo. Como o git submodule sabe qual versão baixar? Parece estar sempre verificando a versão mais recente. Então, como os desenvolvedores garantem a compatibilidade entre o projeto principal e os submódulos?

Seu submódulo é representado como uma input especial com um modo especial (chamado de gitlink , veja ” Repositórios git nesteds sem submódulos? “):
(Veja ” Confirmação do submódulo do git passado “)

 new file mode 160000 index 0000000..4c4c5a2 

Portanto, não está verificando a versão “LATEST”, mas sempre um SHA1 específico, e o faz em um modo DETACHED HEAD (consulte ” Como tornar o submódulo com HEAD desconectado a ser anexado ao HEAD real? “.

Isso não significa que você não possa atualizar um submódulo, como explico em ” true nature of submodules “.

Para mais sobre submódulos, e potencialmente porque você pode não querer usá-los (!), Leia o artigo sóbrio ” Por que sua empresa não deve usar submódulos Git “, de Amber Yust (também em SO ).

Apenas um pequeno extrato, para chutes e risadinhas (ênfase minha):

Quando você invoca a git submodule update ele procura no repository pai um SHA para cada submódulo, entra nesses submódulos e efetua o check out dos SHAs correspondentes.
Como seria o caso se você fez o check out de um SHA em um repository regular, isso coloca o submódulo em um estado HEAD separado.

Se você fizer alterações no submódulo e confirmar, o Git terá o prazer de criar o commit… e deixar você com um HEAD separado. Veja onde isso está indo ainda?

Digamos que você mescle algumas alterações que incluam outra atualização de submódulo. Se você ainda não tiver feito a alteração do seu submódulo no projeto pai, o Git não considerará seu novo commit no submódulo como um conflito, e se você executar o git submodule update ele irá limpar o commit sem aviso, substituindo-o com isso do ramo que você acabou de fundir .

Espero que você tenha ativado o reflog do seu submódulo ou ainda tenha o antigo commit na rolagem do seu terminal, porque senão você perdeu todo o trabalho que você fez .

Err … “ai”.


Observe que agora um submódulo pode rastrear o mais recente a partir de um ramo: consulte ” git submodule tracking latest “.