Quais são as diferenças conceituais entre o uso do submódulo git e da subárvore?
Quais são os cenários típicos para cada um?
git
git-submodules
git-subtree
Nathan H
fonte
fonte
Respostas:
Você mantém apenas referências em seu repo pai ( gitlinks , entradas especiais no índice )
Você pode criar um submódulo para seguir o HEAD de uma ramificação de um repositório remoto do submódulo, com:
o
git submodule add -b <branch> <repository> [<path>]
. (para especificar um ramo a seguir)o
git submodule update --remote
que atualizará o conteúdo do submódulo para o HEAD mais recente<repository>/<branch>
, por padrãoorigin/master
. Seu projeto principal ainda acompanhará os hashes do HEAD do submódulo, mesmo que--remote
seja usado.Veja um exemplo nesta resposta .
fonte
add -b
e--remote
depois nos comandos de atualização, conforme a documentação de atualização do submódulo . Nesse caso, ainda é-b
realmente necessário seguir o HEAD do mestre?-b
é usado para gerar os metadados .gitmodule corretos para o submódulo (é equivalente a agit config -f .gitmodules submodule.<path>.branch <branch>
).--remote
---remote
funciona também se-b
não tiver sido usadaadd
. Em ambos os casos, a atualização causará uma confirmação no repositório pai que hospeda o submódulo, portanto os links nem sempre "apontam para o HEAD" de uma maneira muito automática ... ou eu não entendi ou essa reivindicação melhor ser removido da resposta original (?)submódulo é link;
subárvore é cópia
fonte
A diferença conceitual é:
Com os submódulos git, você normalmente deseja separar um repositório grande em outros menores. A maneira de referenciar um submódulo é no estilo maven - você está referenciando um único commit do outro repositório (submódulo). Se você precisar de uma alteração no submódulo, precisará fazer uma confirmação / envio dentro do submódulo, faça referência ao novo commit no repositório principal e, em seguida, confirme / envie a referência alterada do repositório principal. Dessa forma, você precisa ter acesso aos dois repositórios para a compilação completa.
Com a subárvore git, você integra outro repositório ao seu, incluindo seu histórico. Portanto, depois de integrá-lo, o tamanho do seu repositório provavelmente é maior (portanto, essa não é uma estratégia para manter os repositórios menores). Após a integração, não há conexão com o outro repositório e você não precisa de acesso a menos que queira obter uma atualização. Portanto, essa estratégia é mais para reutilização de código e histórico - eu pessoalmente não a uso.
fonte
git subtree
você ainda pode também empurrar - se você quisesse - certo?O submódulo que
envia um repositório principal para um controle remoto não envia os arquivos do submódulo
subárvore
empurrando um repositório principal para remoto empurra arquivos da subárvore
fonte
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master