Repositórios aninhados do Git?

181

Posso aninhar repositórios Git? Eu tenho:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

Será que faz sentido para git init/addo /project_rootpara facilitar o gerenciamento de tudo localmente ou tenho de gerir my_projecteo 3o partido um separadamente?

Jeremy Raymond
fonte

Respostas:

159

Você pode estar procurando pelo recurso Git chamado submódulos . Esse recurso ajuda a gerenciar repositórios dependentes aninhados dentro do repositório principal.

Greg Hewgill
fonte
43
Como um iniciante em relação ao git, achei este blog / tutorial mais fácil de entender chrisjean.com/2009/04/20/… É uma abordagem mais simples, focando apenas o git em vez de ter o contexto de um script de shell auxiliar; Eu achei mais fácil de ler.
John K
4
O blog chrisjean.com não parece atual com base em apenas tentar segui-lo. O post wiki de Greg pode ser um pouco mais complicado, mas como um novato git eu prefiro exato simples ...
sage
O blog parece funcionar bem agora, e infelizmente para o sábio, os 34 (agora 35) votos positivos no comentário parecem concordar que há um valor no artigo do blog. Acontece que você não precisa sacrificar a precisão para obter clareza e conselhos específicos de operação. Depois de ler, imagino que o autor já havia pesquisado um pouco e provavelmente leu a documentação real do Git , não apenas a página wiki do kernel.org. Explicação orientada Git o blog do autor em um exemplo totalmente contextualizada parece ser bastante útil para um grande número de indivíduos ...
Matthew Weber
13
BTW que chrisjean link mencionado acima está morto. O link atualizado é chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh
35

Coloque suas bibliotecas de terceiros em um repositório separado e use submódulos para associá-los ao projeto principal. Aqui está um passo a passo:

http://git-scm.com/book/en/Git-Tools-Submodules

Ao decidir como segmentar um repositório, eu normalmente decidia com base na frequência com que os modificava. Se é uma biblioteca de terceiros e apenas as alterações que você está fazendo estão atualizando para uma versão mais recente, você deve definitivamente separá-la do projeto principal.

Igor Zevaka
fonte
22

Apenas para completar:

Há outra solução, eu recomendaria: mesclagem de subárvores .

Ao contrário dos submódulos, é mais fácil de manter. Você criaria cada repositório da maneira normal. Enquanto estiver no seu repositório principal, você deseja mesclar o mestre (ou qualquer outra ramificação) de outro repositório em um diretório do diretório principal.

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

Em seguida, para puxar o outro repositório para o diretório (para atualizá-lo), use a estratégia de mesclagem de subárvore:

$ git pull -s subtree OtherRepository master

Estou usando esse método há anos, funciona :-)

Mais sobre essa maneira, incluindo compará-lo com submódulos, pode ser encontrado neste documento de instruções do git .

Phil
fonte
A referência de mesclagem da subárvore no livro git não funciona mais. Atualmente, este parece ser o link: git-scm.com/book/en/v2/…
ericx 7/11/16
18

Você poderia adicionar

/project_root/third_party_git_repository_used_by_my_project

para

/project_root/.gitignore

isso deve impedir que o repositório aninhado seja incluído no repositório pai e você pode trabalhar com eles independentemente.

Mas: se um usuário executar git clean -dfx no repositório pai, ele removerá o repositório aninhado ignorado. Outra maneira é ligar o link simbólico à pasta e ignorá-lo. Se você executar o git clean, o link simbólico será removido, mas o repositório 'aninhado' permanecerá intacto, pois realmente reside em outro lugar.

mikkelbreum
fonte
5

Resumo.

Posso aninhar repositórios git?

Sim. No entanto, por padrão, o git não controla a .gitpasta do repositório aninhado. O Git possui recursos projetados para gerenciar repositórios aninhados (continue lendo).

Faz sentido git init / add the / project_root para facilitar o gerenciamento de tudo localmente ou tenho que gerenciar o my_project e o terceiro separadamente?

Provavelmente não faz sentido, pois o git possui recursos para gerenciar repositórios aninhados. Os recursos integrados do Git para gerenciar repositórios aninhados são submodulee subtree.

Aqui está um blog sobre o tópico e aqui está uma pergunta de SO que aborda os prós e contras do uso de cada um.

preguiçoso
fonte
2

Eu usaria um repositório por projeto. Dessa forma, a história se torna mais fácil de navegar.

Também verificaria a versão da biblioteca de terceiros que estou usando, no repositório do projeto que a está usando.

gnud
fonte