Git y los sub-módulos

A pesar de que en la oficina usamos SVN, llevo un tiempo usando Git para el control de versiones de mis chorradillas (gracias a la bendita ayuda de Antonio) y debo decir que estoy más que contento. Es todo un gustazo utilizarlo, incluso sin interfaz gráfica, directamente desde la línea de comandos (con ZSH + oh-my-zsh, por supuesto).

Una de las cosas que estoy haciendo con Git es utilizar su sistema de sub-módulos para integrar proyectos dentro de proyectos. Es decir, tener un proyecto versionado con Git dentro de otro proyecto también versionado (à la Inception).

Os pondré como ejemplo el theme de este blog, que lo tengo versionado con Git. En él hago uso de Flaminwork (un framework del que ya os hablaré en otro post) que es un proyecto Git en si mismo. ¿No sería estupendo poder obtener las últimas novedades en el Flaminwork del theme directamente desde el repositorio central? Es muy sencillo conseguirlo con los sub-módulos de Git:

# Entramos en el directorio de nuestro proyecto ya versionado con Git
> cd coloresefimeros/

# Añadimos nuestro sub-módulo desde el repositorio remoto,
# metiendo su contenido en el directorio "flaminwork"
> git submodule add git@github.com:juanghurtado/flaminwork.git flaminwork

# Si accedemos al directorio "flaminwork" nos encontraremos en el
# repositorio de Flaminwork, no en el del theme
> cd flaminwork/

# Y cada vez que queramos actualizarlo, no tendremos más que hacer un pull
> git pull

Este sistema es genial para poder actualizar de forma sencilla proyectos como Flaminwork que, por su naturaleza, se utilizan siempre dentro de otros proyectos.

Pero aún hay más: Flaminwork, al tratarse de un framework front-end, no tiene forma de ser testeado salvo en proyectos reales (como es el caso del theme de este blog), así que si durante su uso en el theme encuentro algo que solucionar en Flaminwork no necesito abrir el proyecto, editarlo, subir los cambios y bajármelos en la copia de Flaminwork que tengo en el theme… Lo puedo hacer directamente en el sub-módulo que he creado, porque ese ya es el proyecto en si. Tan sencillo como realizar los cambios y hacer push desde el submódulo:

# Accedo al directorio del submódulo dentro del theme
> cd coloresefimeros/flaminwork/

# Realizo los cambios
> ....

# Y los subo al repositorio central en GitHub
> git push

# Como también quiero que el theme guarde los cambios
# realizados en el sub-módulo, también hago commit del
# proyecto padre
> cd ..
> git add .
> git commit -m 'Update Flaminwork to v0.1-RC1'
> git push

¿Fácil, verdad? Si hasta yo que no soy más que un maquetador web puede hacer esto, cualquiera puede hacerlo y beneficiarse de todas las ventajas que ofrece Git, que no son pocas. Ya os iré contando más cositas conforme vaya aprendiendo, mientras tanto os recomiendo que le echéis un ojo al libro Pro Git, de Scott Chacon, disponible on-line de forma gratuita.