Agrupando vários repositórios Git que fazem parte do mesmo projeto geral

14

Digamos que eu tenha um projeto que tenha vários componentes: um componente de servidor, um componente de aplicativo Web, um componente iOS, um componente Android etc. Esses componentes são todos bases de código separadas, mas também são pouco acopladas (por exemplo, uma alteração no servidor código também pode exigir uma alteração em todos os outros componentes)

Qual é a maneira mais eficiente no Git de organizar este projeto? Se você colocar tudo em um repositório, você sempre terá as versões mais recentes, mas as coisas ficam bastante complicadas quando você começa a alterar um componente e não os outros.

Por outro lado, se você criar cada componente como um repositório separado, como poderá "vincular" esses repositórios para saber que a versão 2.0 do aplicativo requer a versão 1.5 do componente do servidor, etc.?

Existe um recurso no git fora de manter leia-me atualizado (ou alguma solução melhor que não vejo) para gerenciar com mais eficácia vários repositórios relacionados?

user1203054
fonte
Esses componentes realmente dependem um do outro, como o relacionamento entre um componente liberável e uma biblioteca? Ou você está apenas tentando manter todos os seus componentes liberáveis ​​sincronizados?
Useless
Aqui está uma discussão mais antiga sobre o StackOverflow (milagrosamente ainda não fechado).
Dan Dascalescu

Respostas:

6

Os subprojetos são o local em que os sistemas de controle de versão distribuído (DVCS) começam a, se não desvendar, certamente se tornam um pouco complicados.

Os sub - módulos Git e os sub- repositórios Mercurial visam o suporte ao subprojeto. Ambos aprimoraram versão por versão (a ponto de o antigo "recurso desse Mercurial existir", mas você provavelmente não deveria usá-lo) "o aviso não é mais o front-and-center.)

Ainda assim, os repositórios de projeto múltiplo permanecem mais um caso de uso de especialidade do que um recurso que todos usam. A documentação contém inúmeras advertências e instruções "como usar isso", que deixam claro que o gerenciamento de "projetos de projetos" é uma preocupação de dois níveis, com o meta gerenciamento ligeiramente, mas genuinamente diferente do gerenciamento de projeto direto e de nível único. Como resultado, há muito menos experiência por aí. E não faltam "não use submódulos git!" e "evite subrepos mercuriais!" comentários e postagens no blog.

Minha própria experiência com subrepos foi mista. Funcionou ... mas também foi irritante. Adoro a idéia de subprojetos, mas, na prática, acho que as alternativas - grandes repositórios all-in-one ou projetos de irmãos complementares - podem ser mais facilmente organizadas (embora menos elegantes). Estou ansioso para o dia subrepos são mainstream e não uma dor, mas eu não experimentei isso ainda.

Isso não quer dizer que gerenciar sub-módulos / sub-repositórios não funcione para você, mas é algo que deve ser feito com cuidado e, definitivamente, com algumas experiências e planejamento anteriores.

Dado que você está focado no Git, você também deve explorar as subárvores do Git, que alguns acham ser uma alternativa melhor aos sub-módulos do git .

Jonathan Eunice
fonte
1
Revisitando em 2016: os documentos Hg ainda chamam subrepos um recurso de último recurso . Os documentos do Git estão mais entusiasmados e seu recurso de submódulo agora está mais integrado. Agora, ambos também lidam bem com repositórios aninhados (reconhecendo que o repositório aninhado "tem a bola" com os arquivos que está gerenciando), oferecendo outra opção útil de sub-repositório. Mas as ferramentas DVCS ainda são importantes em repositórios de nível único, portanto os avisos "sub-repos => multiple level management" e "dragons be here" permanecem relevantes.
Jonathan Eunice
2

Se você usa C #, pode usar o NuGet.

Faça de cada componente uma biblioteca e mantenha-os em seu próprio repositório. Faça lançamentos dos componentes básicos que você versão de acordo com o controle de versão semântico.

Por fim, peça ao seu servidor de compilação para empacotar as bibliotecas nos pacotes NuGet e consuma esses pacotes NuGet nos projetos dos componentes front-end (iOS, Android).

A mesma abordagem básica (dependências de versão e pacote) também pode ser usada em outros idiomas, mas pode não ser tão conveniente.

Eu não recomendaria o uso de Submodules Git. Embora possa ser usado para esse tipo de problema na teoria, acho que é um aborrecimento maior do que vale a pena.

Wilbert
fonte
2

Na minha opinião, isso dependeria de quanto eles são realmente acoplados. É realmente bom poder executar um processo automatizado git bisectao rastrear uma regressão, mas isso será difícil de fazer se cada confirmação depender de uma versão diferente de suas outras dependências para executar.

Duas opções possíveis seriam um repositório com submódulos ou vários repositórios com boas práticas de controle de versão.

como você seria capaz de "vincular" esses repositórios para saber que a versão 2.0 do aplicativo requer a versão 1.5 do componente do servidor etc.?

Esse é geralmente o domínio de alguma estrutura de gerenciamento de dependências (por exemplo, Gradle, Maven), não o próprio Git.

androide paranóico
fonte