Submodules | Git
- Submodules | Git
O que é um Git Submodule?
Um Git Submodule é uma forma de incluir um repositório Git dentro de outro repositório Git. Ele permite que você referencie um projeto externo (outro repositório) como parte do seu projeto principal, sem copiar o código para dentro do repositório principal.
🔧 Por que usar submodules?
Você pode usar submodules quando:
- Quer reutilizar código compartilhado entre diferentes projetos.
- Precisa manter uma dependência externa fixa em uma versão específica, com controle total.
- Está trabalhando com um monorepo leve, mas com separação clara entre projetos.
- Deseja contribuir separadamente para o repositório principal e para o submódulo.
📦 Como funciona (por baixo dos panos)?
- Um submodule é basicamente uma referência (commit específico) para um repositório externo.
- O repositório principal armazena essa referência num arquivo chamado
.gitmodulese no index. - O submodule vive em uma pasta dentro do repositório principal, mas é tratado como um repositório independente.
🚀 Comandos principais
1. Adicionar um submodule
git submodule add https://github.com/usuario/repositorio caminho/para/submodulo
Isso cria a pasta, adiciona o submodule e registra em .gitmodules.
2. Clonar um projeto com submodules
git clone --recurse-submodules <url>
Ou, se já clonou sem o --recurse-submodules:
git submodule update --init --recursive
3. Atualizar submodules
git submodule update --remote
Esse comando busca a última versão do branch remoto definido para o submodule (útil se você quer "puxar" atualizações de dependências).
4. Remover um submodule
É mais manual:
- Remover entrada do
.gitmodules - Remover entrada do
.git/config - Remover a pasta do submodule
- Remover do index:
git rm --cached caminho/para/submodulo
⚠️ Cuidados
- Submodules não acompanham automaticamente as mudanças feitas nos repositórios externos. É você quem precisa atualizar as referências manualmente.
- Pode causar confusão se não for bem documentado ou se a equipe não tiver experiência com Git.
- Em times grandes, pode ser melhor usar subtrees ou gerenciadores de dependência (como
git sparse-checkout,NuGet,npm, etc.), dependendo do caso.
📘 Exemplo real
Suponha que você tem um projeto chamado MinhaApp e quer incluir um repositório chamado BibliotecaDeUtilitarios.
git submodule add https://github.com/fulano/BibliotecaDeUtilitarios libs/Utils
Isso criará a pasta libs/Utils, registrará o repositório como submodule, e travará o commit atual. Você pode navegar até lá e usar git normalmente dentro dela.