Submódulos (parte 2)

Ahora que han pasado varios días, podemos continuar grabando la segunda parte de este tutorial presentando los comandos para poner al día un submódulo acoplado a un repositorio, o para poner al día un repositorio con submódulos.

Cuando trabajamos con submódulos en Git, mantenerlos actualizados es fundamental para aprovechar las últimas mejoras, correcciones de bugs o actualizaciones de seguridad que se incorporan en esas dependencias. En proyectos grandes, donde el código se divide en múltiples librerías o módulos independientes, es habitual que tengamos que sincronizar esos submódulos con los cambios que realiza el equipo en sus respectivos repositorios.

Una forma sencilla de actualizar un submódulo es entrar directamente en su carpeta y ejecutar un git pull. Esto nos traerá los últimos commits del repositorio remoto del submódulo, actualizando su contenido local. Por ejemplo, si tenemos un submódulo llamado vendor/bootstrap, al hacer git pull dentro de esa carpeta veremos los nuevos commits que se han añadido y podremos incorporarlos a nuestro proyecto principal haciendo un commit y push del cambio en el puntero del submódulo. Así, el repositorio principal reflejará que ahora apunta a una versión más reciente del submódulo.

Sin embargo, hacer un git pull directamente en cada submódulo puede no ser la forma más segura ni práctica, especialmente si queremos revisar qué cambios estamos incorporando antes de fusionarlos. En ese caso, podemos optar por hacer un git fetch para descargar las actualizaciones sin aplicarlas, y luego inspeccionar las diferencias con comandos como git diff o git log para decidir si queremos hacer un merge. Esto nos da un mayor control sobre qué novedades estamos trayendo a nuestro proyecto.

Cuando trabajamos con varios submódulos, actualizar uno por uno puede ser tedioso. Por suerte, Git ofrece un comando que nos facilita esta tarea: git submodule update --remote --recursive. Este comando busca en todos los submódulos configurados y actualiza cada uno con los últimos cambios disponibles en sus repositorios remotos. La opción --recursive es especialmente útil si los submódulos a su vez contienen otros submódulos, asegurando que toda la cadena de dependencias quede sincronizada. Así, con un solo comando podemos mantener al día todos los submódulos de un proyecto complejo.

Un aspecto importante a tener en cuenta es cómo manejar las actualizaciones de submódulos cuando trabajamos en equipo. Si un compañero actualiza un submódulo y hace push de esos cambios al repositorio principal, nosotros al hacer un git pull en el proyecto principal veremos que el puntero del submódulo ha cambiado, pero nuestro submódulo local seguirá apuntando a la versión antigua. Esto genera un estado inconsistente que debemos resolver.

Para sincronizar nuestro submódulo local con la nueva referencia que ha llegado, podemos usar git submodule update --recursive, que actualizará los submódulos a las versiones indicadas por el repositorio principal. Pero para simplificar aún más este proceso, Git ofrece la opción --recurse-submodules en el comando git pull. Así, al hacer:

git pull --recurse-submodules

Git no solo actualizará el repositorio principal, sino que también hará fetch y update de todos los submódulos, dejándonos todo perfectamente sincronizado sin pasos adicionales. Esta opción también funciona al clonar repositorios con submódulos, usando:

git clone --recurse-submodules <url-del-repositorio>

De esta forma, evitamos problemas de desincronización y podemos trabajar con submódulos sin complicaciones adicionales.

Aunque los submódulos son una solución para organizar proyectos grandes y dividir responsabilidades, hay que tener cuidado al usarlos. Su manejo puede ser complejo y generar confusión si no se entienden bien sus mecanismos de actualización y sincronización. Por eso, es recomendable evaluar si realmente necesitamos submódulos o si otras estrategias, como monorepositorios, pueden ser más adecuadas para nuestro flujo de trabajo. Pero cuando los submódulos son la opción elegida, conocer estas técnicas para mantenerlos actualizados y sincronizados nos ayudará a colaborar de forma más fluida y segura.

Lista de reproducción
  1. 1
    ¿Qué es Git?
    4 minutos
  2. 2
    Cómo instalar Git
    9 minutos
  3. 3
    Creando tu primer commit
    9 minutos
  4. 4
    Qué es el staging area
    10 minutos
  5. 5
    Cómo deshacer modificaciones de archivos
    7 minutos
  6. 6
    Cómo deshacer un commit con reset
    7 minutos
  7. 7
    Cómo revertir un commit con revert
    7 minutos
  8. 8
    Introducción a las ramas
    6 minutos
  9. 9
    Cómo crear y modificar ramas
    6 minutos
  10. 10
    Commits bajo el workflow Feature Branch
    6 minutos
  11. 11
    Cómo fusionar ramas con merge
    6 minutos
  12. 12
    Fusiones conflictivas
    9 minutos
  13. 13
    Cómo construir alias
    7 minutos
  14. 14
    Más sobre conflictos
    9 minutos
  15. 15
    Etiquetas
    7 minutos
  16. 16
    Tags anotados
    9 minutos
  17. 17
    git stash: esconder cambios
    6 minutos
  18. 18
    Introducción a remotos
    5 minutos
  19. 19
    Pusheando a un remoto
    6 minutos
  20. 20
    Clonando y haciendo pull
    6 minutos
  21. 21
    Fetch y pull rebases
    8 minutos
  22. 22
    Rebase
    7 minutos
  23. 23
    Rebase interactivo
    6 minutos
  24. 24
    Master, main y otros nombres de rama
    9 minutos
  25. 25
    git switch
    9 minutos
  26. 26
    git-restore
    10 minutos
  27. 27
    git-grep
    11 minutos
  28. 28
    Gitignore
    11 minutos
  29. 29
    El flag --patch
    9 minutos
  30. 30
    git-apply y parches en bruto (advanced)
    9 minutos
  31. 31
    Merge octopus (advanced)
    9 minutos
  32. 32
    Conventional commits
    12 minutos
  33. 33
    Merge and squash (GitLab / GitHub...)
    6 minutos
  34. 34
    git merge --squash
    7 minutos
  35. 35
    git-bisect
    8 minutos
  36. 36
    git-blame
    6 minutos
  37. 37
    git-reflog
    10 minutos
  38. 38
    Git para la Bash
    11 minutos
  39. 39
    Submódulos (parte 1)
    7 minutos
  40. 40
    Submódulos (parte 2)
    10 minutos
  41. 41
    Otros clientes Git (último episodio)
    9 minutos