Como posso vincular dependências em um repositório git?

148

Nos meus scripts, geralmente uso bibliotecas (minhas ou de outras) que têm seus próprios repositórios. Eu não quero duplicar aqueles no meu repositório e ficar preso a atualizá-los sempre que uma nova versão for lançada. No entanto, quando alguém clona o repositório, ele ainda deve funcionar localmente e não deve ter links quebrados.

Alguma idéia sobre o que eu poderia fazer?

Lea Verou
fonte

Respostas:

211

Você pode fazer isso com submódulos no git. No seu repositório, faça:

git submodule add path_to_repo path_where_you_want_it

Portanto, se o repositório da biblioteca tivesse um URL git://github.com/example/some_lib.gite você o quisesse lib/some_libem seu projeto, digite:

git submodule add git://github.com/example/some_lib.git lib/some_lib

Observe que isso precisa ser feito no diretório de nível superior em seu repositório. Portanto, não cdentre no diretório em que você o coloca primeiro.

Depois de adicionar um submódulo, ou sempre que alguém fizer uma nova verificação em seu repositório, você precisará fazer:

git submodule init
git submodule update

E então todos os submódulos adicionados serão verificados na mesma revisão que você possui.

Quando você deseja atualizar para uma versão mais recente de uma das bibliotecas, cdno submódulo e puxe:

cd lib/some_lib
git pull

Então, ao fazer um, git statusvocê deverá ver lib/someliblistado na seção modificada. Adicione esse arquivo, confirme e você está atualizado. Quando um colaborador puxa essa confirmação em seu repositório, ele será lib/somelibmodificado até que seja executado git submodule updatenovamente.

Emily
fonte
2
Obrigado pela sua resposta, votada! (e provavelmente o aceitará amanhã) Existe uma maneira de adicionar apenas um arquivo do outro repositório como uma dependência? Ou precisa ser uma pasta inteira?
Lea Verou
2
Se você deseja rastreá-lo como um submódulo (e, assim, conseguir facilmente obter atualizações), precisará puxar todo o repositório. Ao contrário de muitos outros VCSs, o git realmente quer apenas lidar com o repositório de nível superior.
21711 Emily
7
leia isso para saber para que serve um submódulo e como solucionar possíveis problemas. e uma discussão sobre isso .
Minghua
1
digamos que você importe como um submódulo outro repositório de sua propriedade. Você pode fazer alterações no repositório original através de alterações locais no submódulo? Digamos que você encontrou um bug e precisa atualizar o original?
18717 Andrevenancio
3
Eu sei que essa é uma resposta antiga, mas os sub-módulos git podem ser atualizados usando git submodule update --remoteeu recomendo o uso de mais sinalizadores para projetos mais complexos. Eu usogit submodule update --remote --recursive --init
Chris