En algunas ocasiones mientras trabajamos en algún proyecto nos surge la necesidad de subdividir el mismo en subproyectos para poder reutilizar algún componente. Nos gustaría poder mantener el seguimiento de nuestro repositorio principal y a la vez llevar un repositorio particular de algún componente que otros proyectos puedan usar.
La solución que ofrece git son los submódulos (submodules en inglés). Los submódulos permiten insertar un repositorio dentro de otro y realizar cambios o actualizaciones sobre el mismo. Si miramos la documentación oficial puede resultar un poco confuso y complejo por lo que realizaremos un resumen de los pasos a realizar para trabajar con submódulos en el caso que nos ocupa.
Cambiar subdirectorios por submódulos
Antes de empezar es recomendable cerciorarse de que tenemos copia de seguridad de los archivos que vamos a modificar. Aunque en principio no parezca necesaria al trabajar con repositorios (normalmente con copia en servicios de terceros como bitbucket o github) más vale prevenir que curar por lo que haz una copia de seguridad extra de tus archivos.
El primer paso para cambiar nuestro subdirectorio, donde tenemos el componente que queremos independizar, por un submódulo es crear un nuevo repositorio con dicho código. Para ello lo copiamos a otro carpeta externa y creamos un nuevo repositorio que subiremos a bitbucket (o cualquier otro servicio como github, etc).
Una vez tenemos nuestro nuevo repositorio debemos eliminar la carpeta antigua por lo que volvemos al proyecto principal y eliminamos la carpeta y el seguimiento de la misma:
1 2 |
rm -Rf Componente_DIR/ git rm -r Componente_DIR/ |
Tras esto debemos añadir el repositorio del componente al proyecto de nuevo en el mismo subdirectorio en el que se encontraba en primer lugar:
1 |
git submodule add http://url_del_repositorio.git Componente_DIR |
Una vez hecho esto ya estamos listos para commitear nuestros cambios.
Actualizar un submódulo
Lo más sencillo para actualizar un submódulo a la rama principal del proyecto es ejecutar el comando:
1 |
git submodule update --remote Componente_DIR |
También podemos trabajar como con cualquier repositorio:
1 |
git pull |
Recordando que debemos ejecutarlo dentro de la carpeta del submódulo.
Trabajar en un submódulo
Lo más probable si estas usando submódulos, es que desees realizar cambios en el submódulo al mismo tiempo que realizas cambios en el código del proyecto principal.
Por tanto no solo tenemos que publicar esos cambios en el repositorio principal si no también en el repositorio del complemento pues de lo contrario, al actualizar, perderemos los cambios.
Todos los cambios en el interior de un submódulo deben commitearse desde dentro del submodulo. De esa manera son guardados dentro de su repositorio. Una vez realizado ese commit desde el proyecto principal lo que ha cambiado es la versión del submódulo que podemos introducir en nuestro propio commit como si se tratase de cualquier otro archivo.
Una vez hecho esto podemos subirlo al repositorio en la nube de varias formas:
Git Push en cada repositorio
Si no nos importa realizar el trabajo manualmente solo tenemos que entrar en cada uno de los submodulos (y en el repositorio principal) y hacer git push
en cada uno de ellos. De esa manera ya estarán disponibles para todo el equipo.
Git Push recursivo
Una de las opciones que nos da git push
es la de realizar un chequeo en todos los submódulos para ver en cuales son necesarios realizar push.
Para ello podemos usar el comando:
1 |
git push --recurse-submodules=check |
Lo que nos dará información sobre los submódulos a enviar al repositorio remoto. También tenemos la opción de no solo chequear si no también enviar automáticamente. Para ello usamos el comando siguiente:
1 |
git push --recurse-submodules=on-demand |
Podemos configurar nuestra opción por defecto.
1 2 3 |
git config push.recurseSubmodules check //OR git config push.recurseSubmodules on-demand |
Clonar un repositorio con submódulos
Si clonamos el repositorio principal que contiene submódulos, las carpetas de estos submódulos aparecerán vacías. Debemos iniciar los submódulos y actualizarlos con los últimos cambios disponibles.
1 2 |
git submodule init git submodule update |
Si por el contrario, queremos hacerlo de una sola vez podemos añadir la opción --recursive
al clonar el repositorio de modo que se realicen estos pasos automáticamente.
1 |
git clone --recursive https://url_repositorio_principal.git |
Incluir el submódulo en otro proyecto
La razón principal por lo que estamos trabajando con git submodule es la de poder compartir componentes en distintos proyectos. Realizar esto es bastante sencillo y en cierta medida ya lo hicimos en nuestro proyecto principal.
1 |
git submodule add http://url_del_repositorio.git Componente_DIR |
En este caso Componente_DIR puede valer lo que queramos pues no dependemos de ningún valor previo. Una vez en este punto trabajamos con este proyecto de la misma forma en la que venimos trabajando en todo el artículo.
Conclusión
Trabajar con submódulos puede ser algo más complicado de lo que desearíamos por lo que es vital usarlos con moderación para evitar quebraderos de cabeza. El principal problema se presenta al trabajar con distintas ramas y añadir submódulos en algunas de ellas pero no en todas, lo que puede llevar a ciertas situaciones extrañas.
De todas formas está bien conocer otras posibilidades y para ciertas situaciones es la mejor opción.