Sub-módulo Git vs clone Git

18

Estou trabalhando em um projeto de código aberto no GitHub.

Ele possui um subdiretório / fornecedor no qual possui uma cópia de várias bibliotecas externas. O mantenedor original do projeto atualizava esse diretório com uma cópia mais recente da biblioteca externa de vez em quando.

Um desenvolvedor me enviou uma solicitação de recebimento com a idéia de substituir essa cópia pelo submódulo git .

E estou pensando se é uma boa ideia ou não.

Profissionais do submódulo Git:

  • Os submódulos foram projetados especificamente para cenários semelhantes
  • Isso remove a possibilidade de confirmação acidental ao Fornecedor, que será substituída na próxima atualização

Sub-módulo Git Contras:

  • Parece que os submódulos do git aumentam a complexidade do mantenedor para uma pessoa que clonará / puxará o projeto (etapas adicionais necessárias após você clonar para começar a trabalhar com o projeto: "git submodule init", "git submodule update"

Qual a sua opinião sobre isso?

Mais uma coisa. Esse problema é uma biblioteca de tamanho razoavelmente pequeno com dependências externas muito limitadas. Eu acho que qualquer ferramenta de construção seria um exagero por enquanto.

Victor Ronin
fonte
4
Como alternativa, eles podem executar git clone --recursivee, em seguida, não precisam executar os comandos do submódulo. Ninguém mais havia mencionado esse petisco; a maioria das pessoas que conheço que têm submódulos anuncia isso no README.
precisa

Respostas:

9

Uma alternativa para um submódulo é usar git subtree. Isso oferece os benefícios, git submodulemas sem aumentar a complexidade para o usuário final. O repositório de terceiros é mesclado na árvore principal do projeto, mas há metadados armazenados da maneira que você pode:

  • extrair o repositório de terceiros posteriormente, se alguma alteração interessante tiver sido feita
  • mesclar novas atualizações do repositório de terceiros ( mesclar notas , não substituir)

Para usuários do Git que não são sofisticados o suficiente para entender os submódulos, a abordagem da subárvore torna a obtenção de um clone do seu projeto mais difícil do que qualquer outro clone. Uma breve descrição da documentação:

As subárvores permitem que os subprojetos sejam incluídos em um subdiretório do projeto principal, incluindo opcionalmente todo o histórico do subprojeto.

Por exemplo, você pode incluir o código fonte de uma biblioteca como um subdiretório do seu aplicativo.

As subárvores não devem ser confundidas com os submódulos, destinados à mesma tarefa. Diferentemente dos submódulos, as subárvores não precisam de construções especiais (como arquivos .gitmodule ou gitlinks) presentes no seu repositório e não forçam os usuários finais do seu repositório a fazer algo especial ou a entender como as subárvores funcionam. Uma subárvore é apenas um subdiretório que pode ser confirmado, ramificado e mesclado com o projeto da maneira que você desejar.

Eu havia montado um projeto no trabalho usando submódulos, e os problemas em manter os submódulos atualizados nos clones de todo mundo eram muito trabalhosos. Recentemente, mudei para o uso de subárvores em todos os lugares e esses problemas desapareceram.

Observe que git-subtree faz parte do git/contribdiretório e deve ser instalado separadamente.

Greg Hewgill
fonte
4

Uma desvantagem do uso de submódulos é que os tarballs ou arquivos zip no Github (e muitos outros serviços) não incluem as fontes dos submódulos. Ou seja, os arquivos não são independentes. Isso é um problema se o repositório for pequeno e realmente não tiver um script de construção, como um site HTML estático, dependendo de uma biblioteca JavaScript.

Lekensteyn
fonte
3

Este é o local ideal para usar submódulos. Eles reduzem o tamanho e a complexidade do seu repositório e facilitam a atualização das bibliotecas externas para uma nova versão.

Eles não são difíceis de descobrir como usar, e são bastante usados ​​nessa situação; portanto, basta anotar no README do projeto que você usa submódulos e o que fazer, e as pessoas devem ser capazes de descobrir fora. A primeira vez que encontrei um repositório com um submódulo, eu o instalei em 10 a 15 minutos e nunca tive problemas em descobrir o que fazer desde então.

Jonathan Patt
fonte
1
Como um adendo a isso, se seu aplicativo falhar ao inicializar, convém verificar se o submódulo foi inicializado - e fornecer uma mensagem de erro amigável, caso contrário.
Jonathan Rico
1
Veja também a resposta de Lekensteyn sobre arquivos zip sem arquivos de submódulo. Isso significa que os submódulos talvez não sejam a melhor abordagem se você estiver fornecendo código publicamente, mas é bom para o código privado que é garantido que é clonado. Caso contrário, prefira subárvores.
Engenheiro de
3

O uso de submódulos impede que você faça alterações locais no código e cria uma dependência no repositório externo. Se você tiver certeza de que nunca desejará personalizar uma biblioteca ou fazer correções de erros locais e pode ter certeza de que o servidor externo estará sempre disponível quando você quiser clonar uma nova cópia.

Em resumo - você quer simplesmente usar as bibliotecas ou as considera parte da sua base de código? Se eles não são o seu código, por que eles estão no controle de versão e não apenas em algo que você precisa ter instalado?

Sean McSomething
fonte
6
Os submódulos não impedem que você faça alterações locais. Pelo contrário, eles permitem que você acompanhe essas alterações e use versões diferentes (seus ajustes ou versões da biblioteca) da biblioteca em diferentes projetos.
precisa