Diferenças entre o submódulo git e a subárvore

300

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?

Nathan H
fonte
3
Isso pode não responder a todas as suas perguntas, mas é uma leitura interessante sobre o assunto: blogs.atlassian.com/2013/05/…
Chop
Pergunta semelhante é stackoverflow.com/questions/571232/...
Michael Freidgeim
"Alternativas para Git submódulos?": Stackoverflow.com/questions/6500524/...
brillout

Respostas:

177

E se eu quiser que os links sempre aponte para o HEAD do repositório externo?

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 --remoteque atualizará o conteúdo do submódulo para o HEAD mais recente <repository>/<branch>, por padrão origin/master. Seu projeto principal ainda acompanhará os hashes do HEAD do submódulo, mesmo que --remoteseja usado.


VonC
fonte
a sua resposta parece ir contra o votou resposta aqui: stackoverflow.com/questions/10443627/...
Nathan H
@NathanH this (a possibilidade de rastrear o HEAD) foi adicionado um ano depois (março de 2013, git 1.8.2: github.com/git/git/blob/… )
VonC
Vejo que o comportamento de acompanhamento do submódulo também é mencionado em sua outra resposta . Nesse caso, acho que você quer dizer que sempre apontando para o HEAD de um submódulo é realizado usando-se ambos add -be --remotedepois nos comandos de atualização, conforme a documentação de atualização do submódulo . Nesse caso, ainda é -brealmente necessário seguir o HEAD do mestre?
matanster
@matt -bé usado para gerar os metadados .gitmodule corretos para o submódulo (é equivalente a a git config -f .gitmodules submodule.<path>.branch <branch>).
VonC
Então, pouco tem a ver com a habilitação --remote- --remotefunciona também se -bnão tiver sido usada add. 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 (?)
matanster
351

submódulo é link;

subárvore é cópia

Feng
fonte
121

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.

Niklas P
fonte
Mas com git subtreevocê ainda pode também empurrar - se você quisesse - certo?
Ixx 21/01
@lxx Se você souber o URL do repositório…
Franklin Yu
@FranklinYu Por que ele não sabia disso? não consegue obter essas informações nos metadados locais do git?
adi518
@ adi518 Sim, se você foi quem criou a subárvore. No entanto, se você empurrou seu repositório para o GitHub e outros o clonaram, não acho que ele / ela saiba automaticamente o URL da subárvore.
Franklin Yu
@NiklasP - você pode elaborar "referenciar o novo commit no repositório principal"? Esse é o único passo que não estou claro sobre como executar e, portanto, "referência alterada" também não é algo que eu entenda.
Robert Oschler
21

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

Maciek Rek
fonte
3
"empurrar um repositório principal para remoto empurra os arquivos das subárvores" Não, não.
J Bramble
@JBramble Eu provavelmente deveria mencionar que isso é feito com o aplicativo SourceTree, por exemplo:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek