miércoles, 19 de diciembre de 2012

Submódulos con Git

Hola a todos. Últimamente he estado estudiando un poco de Git, y encontré una funcionalidad que puede ser de mucha ayuda cuando tenemos sistemas muy grandes, o muchas dependencias que son desarrolladas en paralelo a nuestro proyecto. Los submódulos nos permiten tener un directorio dentro de nuestro proyecto Git que es a su vez un proyecto Git totalmente a parte. A continuación, veremos como hacer uso de estos:

Agregar submódulo:

$ git submodule add <url del submódulo> <ruta del submódulo>

Ejemplo:

$ git submodule add https://sitio-web.dominio/proyecto.git deps/proyecto

Clonar un proyecto que usa submódulos:

Ahora, cuando clonamos un proyecto que tiene submódulos, estos no se descargan automáticamente, a pesar de que se crean sus directorios. Para descargar los submódulos tenemos que hacer lo siguiente:

# Primero, inicializar todos los submódulos
$ git submodule init
# Luego y por último descargarlos
$ git submodule update

Actualizar submódulos:

Cuando desarrollamos submódulos en paralelo con nuestro proyecto principal, a menudo queremos estar actualizando nuestras dependencias, para esto, bastará con entrar al directorio donde tenemos nuestro submódulo y hacer pull (git pull), o si lo que queremos es actualizar todos los submódulos al mismo tiempo:

$ git submodule foreach git pull

Si lo que queremos es eliminar un submódulo que ya no usaremos, debemos seguir varios pasos:

1. Lo primero es abrir el archivo .gitmodules y eliminar las lineas que contengan información de este módulo. Este archivo luce así:

[submodule "deps/zlib"]
        path = deps/zlib
        url = git@github.com:sigifredo/zlib.git
[submodule "deps/libgit2"]
        path = deps/libgit2
        url = git@github.com:sigifredo/libgit2.git
Archivo: .gitmodules

Debemos eliminar las lineas en negrilla.

2. También tendremos que abrir el archivo .git/config y eliminar la configuración del submódulo. De nuevo, el archivo luce así:

[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
        hideDotFiles = dotGitOnly
[remote "origin"]
        url = git@github.com:sigifredo/gito.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "development"]
        remote = origin
        merge = refs/heads/development
[submodule "deps/zlib"]
        url = git@github.com:sigifredo/zlib.git
[submodule "deps/libgit2"]
        url = git@github.com:sigifredo/libgit2.git
Archivo: .git/config

Debemos eliminar las lineas en negrilla.

3. Por último, debemos eliminar el directorio del submódulo de la siguiente manera:

$ git rm --cached <dirección del submódulo>

Ejemplo:

$ git rm --cached deps/proyecto

Estos son los procedimientos básicos para trabajar con los submódulos de Git. Espero les sea de mucha ayuda en su proceso de desarrollo. Un saludo.

Referencias:
- Página oficial del proyecto: http://git-scm.com/
- Git Book (en ingles): http://git-scm.com/book