Skip to content

Git Submodules y Repos Grandes

Cuándo Considerarlos

SituaciónSubmoduleAlternativa
Dependencia versionada exactaPaquete publicado
Desarrollo fuertemente acopladoMonorepo / carpeta
Repos muy pesados unidosA vecesDividir + fetch parcial

Añadir Submodule

bash
git submodule add https://github.com/org/lib.git libs/lib

Inicializar / Actualizar

bash
git submodule update --init --recursive

Clona y sincroniza anidados.

Estado

bash
git submodule status

Muestra 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 --merge

Usa rama registrada .gitmodules.

Archivo .gitmodules

[submodule "libs/lib"]
	path = libs/lib
	url = https://github.com/org/lib.git
	branch = main

Buenas Prácticas

PrácticaRazón
Pocos submodulesComplejidad menor
Fijar commit explícitoReproducibilidad
Scripts de syncOnboarding fácil
Documentar actualizaciónEvitar confusión

Problemas Comunes

ProblemaSolución
Submodule vacíogit submodule update --init
Cambios no detectadosCommit dentro + padre
Rama equivocadaAjustar 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/lib

Alternativas Modernas

NecesidadSolución
Share código internoMonorepo (pnpm workspaces, Nx, Turborepo)
Librerías externasRegistro paquetes (npm, Maven)
Repos grandesSparse checkout / partial clone

Sparse Checkout (Gran Repo)

bash
git sparse-checkout init --cone
git sparse-checkout set src/core src/api

Partial Clone

bash
git clone --filter=blob:none --sparse https://github.com/org/big.git

LFS (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.