Git Submodules y Repos Grandes
Cuándo Considerarlos
| Situación | Submodule | Alternativa |
|---|---|---|
| Dependencia versionada exacta | ✔ | Paquete publicado |
| Desarrollo fuertemente acoplado | ✘ | Monorepo / carpeta |
| Repos muy pesados unidos | A veces | Dividir + fetch parcial |
Añadir Submodule
bash
git submodule add https://github.com/org/lib.git libs/libInicializar / Actualizar
bash
git submodule update --init --recursiveClona y sincroniza anidados.
Estado
bash
git submodule statusMuestra commit fijado.
Cambiar Versión
Dentro del submodule:
bash
cd libs/lib
git fetch
git checkout <tag|commit>
cd ../../
git add libs/lib
git commit -m "chore: bump lib to v1.4.2"Extraer Cambios Recientes de Todos
bash
git submodule update --remote --mergeUsa rama registrada .gitmodules.
Archivo .gitmodules
[submodule "libs/lib"]
path = libs/lib
url = https://github.com/org/lib.git
branch = mainBuenas Prácticas
| Práctica | Razón |
|---|---|
| Pocos submodules | Complejidad menor |
| Fijar commit explícito | Reproducibilidad |
| Scripts de sync | Onboarding fácil |
| Documentar actualización | Evitar confusión |
Problemas Comunes
| Problema | Solución |
|---|---|
| Submodule vacío | git submodule update --init |
| Cambios no detectados | Commit dentro + padre |
| Rama equivocada | Ajustar en .gitmodules + sync |
Eliminar Submodule (Secuencia)
bash
git submodule deinit -f libs/lib
rm -rf .git/modules/libs/lib
rm -rf libs/lib
git rm -f libs/libAlternativas Modernas
| Necesidad | Solución |
|---|---|
| Share código interno | Monorepo (pnpm workspaces, Nx, Turborepo) |
| Librerías externas | Registro paquetes (npm, Maven) |
| Repos grandes | Sparse checkout / partial clone |
Sparse Checkout (Gran Repo)
bash
git sparse-checkout init --cone
git sparse-checkout set src/core src/apiPartial Clone
bash
git clone --filter=blob:none --sparse https://github.com/org/big.gitLFS (Archivos Grandes)
bash
git lfs install
git lfs track "*.psd"Resumen
Submodules sirven para dependencias pinneadas de bajo cambio. Para colaboración diaria intensiva, prefiere monorepo o empaquetado.
