Hero

Manejando multiples repositorios git todos juntos

Marzo 09, 2022

ibonelli
git
CI/CD

Las posibilidades dentro de git son: submodule y subtree. Pero hay otros sistemas de manejo de múltiples repositorios.

Manejando multiples repositorios git todos juntos

El sospechoso de siempre

git submodule es simple de usar, pero tiene sus limitaciones. En cuanto necesitemos algo más que una referencia básica, vamos a sentir que necesitamos una herramienta distinta. A pesar de poder traerlos todos juntos, cada repositorio seguirá siendo uno separado.

Opciones

Existen muchas, pero las dos más importantes son:

Solo por mencionar otros tenemos a:

  • Git Slave: Que la verdad que no parece ser muy popular en este momento.
  • myrepos: Este si bien no es popular, tiene una extensión para Drupal. Pero fue escrito en Perl. Llegué a él lleyendo este StackOverflow post.

Y hay bastantes más (incluso pagos), pero estos son los open-source que elijo mostrar.

Yo no recomiendo buscar más opciones. Para cualquier caso de uso que no podamos cubrir con git-submodule, git-subtree o GoogleRepo, mi recomendación sería usar cosas como:

  • Ambientes de Docker con Docker-Compose para orquestar el ambiente local.
  • Utilizar herramientas CI/CD como Jenkins para orquestar y desplegar a ambientes remotos.
  • Tener ambientes de testing en gitHub con pipelines (o similares).
  • Usar el archiconocido make para la orquestación local (como OpenCommerce lo hace).
  • Si estamos usando PHP/Composer podemos usar sus opciones de integración VCS.

Existen otros que argumentaran las ventajas de usar un monorepo, pero esa es otra estrategia distinta.

En resumen, yo prefiero usar otro tipo de herramientas. No pedirle a git que maneje los aspectos de CI/CD.

¡Tantas opciones!

Como prefiero soluciones y herramientas simples, cuando las cosas se complican mucho o vuelven pesadas suelo preguntarme si estoy usando las herramientas correctas. Con eso en mente, prefiero quedarme con la solución más sencilla posible hasta que llegue a su límite de uso. Además debo agregar que, existiendo tantas soluciones CI/CD, me parece sobrecargar a git el pedirle este tipo de funcionalidades.

Con todo esto en mente y a pesar de sus limitaciones, para mi mini proyecto en particular prefiero seguir usando submodule. Mientras nuestras necesidades sean simples y estemos dispuestos a manejar los repositorios separadamente, nos va a alcanzar. Es un poco molesta la sintaxis para traer todas las subcarpetas:

git clone --recurse-submodules --remote-submodules --branch <your-branch> <repo-url>

Pero funciona y es muy sencillo de configurar:

git submodule add -b <branch> <URL-to-Git-repo>
git submodule init

Luego de correr esos comandos tendremos en el raiz de nuestro repositorio el archivo .gitmodules con la configuración de nuestro submódulo/s.

Eso es todo, ese archivo tiene la referencia al submódulo y cuando hagamos un clone (como detallo arriba) nos traerá todo el código junto (incluso si hay submódulos fuera del directorio raiz).

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.