Skip to content

Instantly share code, notes, and snippets.

@nebil
Last active October 29, 2018 00:55
Show Gist options
  • Save nebil/c60ab8d9e3b816d3cb16eb5cc81366ac to your computer and use it in GitHub Desktop.
Save nebil/c60ab8d9e3b816d3cb16eb5cc81366ac to your computer and use it in GitHub Desktop.
git + sh = 💪

git pull bajo esteroides

El propósito de este documento es explicar cómo es posible evitar el tedio de hacer, uno por uno,
git pull hacia muchos (con más de cinco, probablemente ya se justifica) repositorios remotos.
No estoy tan seguro de los posibles casos de uso, pero fue útil cuando tuve que integrar cambios,
en varias ocasiones, desde una docena de repositorios de una organización en GitHub. :grinning:
Además, es una buena oportunidad (o excusa) para mejorar el 🐚-fu.
(Y obviamente, también para procrastinar*.)

Ingredientes

Para lograr un correcto funcionamiento, este documento realizará una serie de supuestos.

Lista de supuestos

  • Tu computador está encendido,
  • estás conectado a internet,
  • y, claro, Git está instalado.

Lista de supuestos interesantes

  • Todos los repositorios ya fueron clonados, y están ubicados en el mismo nivel,
  • y estás utilizando un sistema operativo Unix-like.

Preparación

Este procedimiento cuenta únicamente con dos simples pasos.

  1. 📂 Ve hacia el directorio —más conocido como carpeta— que almacena los repositorios.

    $ cd <path/to/folder/with/repos>
  2. 📥 Realiza (mágicamente) un pull de todos los repositorios.

    $ ls | xargs -I{} git -C {} pull

    Alternativa con paralelismo: -P <max-procs> nos permitirá correr múltiples procesos.
    (Y con este ejemplo, tendríamos máximo ocho procesos.)

    $ ls | xargs -P8 -I{} git -C {} pull

Acerca de las credenciales

La validez de esta subsección depende de tu configuración de Git (e.g. puede que uses SSH).
Pero, si necesitas escribir tus credenciales por cada repositorio al que haces pull,
entonces, para prevenir esto, es recomendable almacenar estos datos de forma temporal.
Esto se puede lograr fácilmente, escribiendo…

$ git config --global credential.helper cache

Luego, este comando modificará tu archivo .gitconfig, que es donde reside tu configuración global de Git.
Esto permitirá, entonces, que Git recuerde tus credenciales en memoria, por quince minutos.
Y claro, una vez transcurrido ese tiempo, tendrás que volver a reescribir tus credenciales.
Sin embargo, ese lapso debería ser más que suficiente para incorporar todos los cambios de los repositorios. 😌

Para versiones antediluvianas de Git

Lo anterior funcionará únicamente si tienes instalada, al menos, la versión v1.7.10 de Git.
No obstante, si esto no fuese así, cuentas con dos alternativas:

  1. ⏭️ Actualizar tu versión de Git.
    De hecho, esto es fuertemente recomendado para protegerse de múltiples vulnerabilidades.

  2. ⚠️ Agregar tus credenciales en el URL.
    Es importante señalar que esta alternativa no es deseable, ya que tu contraseña,
    probablemente, quedará guardada en el historial de tu terminal como texto plano. :cold_sweat:

    $ ls | xargs -I{} git -C {} pull "https://<your-user:your-pass>@github.com/<user|org>/{}"

    Por último, notemos que este comando funcionará sólo si todos los repositorios están bajo
    un mismo usuario (user) u organización (org) de GitHub, según el ejemplo anterior.

Referencias

Esta breve guía emerge a partir de dos recursos. Mi trabajo consistió, simplemente, en mezclar…

  • esta elegante respuesta hallada en StackOverflow,
  • con este artículo ofrecido por GitHub.

Licencia

Creative Commons License
Este documento está bajo una licencia Creative Commons 4.0.


* Bueno, yo procrastino así. 🤓

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment