Cuando tenemos proyectos muy grandes en los que usamos librerías de terceros y estamos usando Git como gestor de versiones, suele ser habitual añadir dichas librerías como submódulos. Esto nos permite que cuando clonamos el proyecto, las librerías también se descarguen. No obstante, la actualización de los módulos no se realiza mediante el comando "pull" del proyecto principal y deberemos realizar un "pull" para cada submódulo que tengamos.
Para realizar el comando "pull" en cada uno de los módulos lo más sencillo es recurrir al siguiente comando:
git submodule foreach git pull origin master
El comando "submodule" junto con el comando "foreach" nos permite ejecutar comandos para cada uno de los submódulos de un proyecto. En este caso ejecutamos el comando "git pull origin master" para traernos los cambios de cada submódulo y tenerlos todos en la ultima versión de la rama "master".
En caso de querer revertir la acción puedes usar el comando "update" para actualizar el árbol de submódulos de manera consistente con el estado almacenado en el proyecto principal. Esto quiere decir nos deshará los cambios realizados.
git submodule update
Internamente en el proyecto principal, para cada submódulo se guarda el commit concreto con el que se trabaja, razón por la que es posible revertir los cambios.
Este comando puede salvarnos, en el caso de que hayamos cambiado la URL remota donde apunta el submódulo y nos coja los cambios de la antigua ubicación. O simplemente puede servirnos para volver a la versión que teníamos, tras haber probado los nuevos cambios del submódulo y no estar contentos con ellos.
En cualquier caso, si por alguna razón hemos cambiado la URL remota de un submódulo en el archivo ".gitmodules", necesitaremos ejecutar el comando "sync" para que sincronice la URL remota con la configuración del archivo ".gitmodules".
git submodule sync
Tras la ejecución del comando podemos volver a ejecutar el comando:
git submodule foreach git pull origin master
Y veremos que los cambios corresponden a la ubicación correcta del submódulo.
Para más información sobre los distintos comandos para los submódulos, consulta la siguiente referencia:
https://git-scm.com/docs/git-submodule
Me recomiendas hacerlo con SOFA Framework? 😛
Jejejejeje... El proyecto oficial no trabaja con submódulos git. No creo que lo hagan porque ya es una compilación realmente pesada la de SOFA y existen binarios precompilados para sus dependencias.
La verdad es que para bien o para mal, SOFA tiene dependecias con Boost, QT, OpenGL y Visual Studio. La peor y más fuerte, desde mi punto de vista, es la de Visual Studio, ya que aunque a día de hoy digan que se puede compilar con 2010, 2012, 2013 y 2015, sólo con la versión de 2013 aseguran una compilación de todas sus partes. Aunque por otro lado, dependencias tan fuertes para funciones básicas, como es el caso de la librería Boost, puede traer sus propios problemas.
En relación a lo último, te recomiendo la siguiente lectura:
http://www.xataka.com/servicios/y-si-el-software-open-source-desapareciera
¡Gracias por comentar! 😉