Automatización de Git con Python por @ycumberbirch

Autor: | Última modificación: 13 de marzo de 2024 | Tiempo de Lectura: 3 minutos
Temas en este post:

Automatización de Git con Python

Ultimamente, he descubierto que Python tiene librerías para todo. Desde las tareas más comunes en el mundo del desarrollo a las más descabelladas, siempre hay una librería de python disponible para ello.
Desk-Drawer-Before_opt_Automatización de Git con Python
Da igual lo que busques, seguro que ¡aquí lo encuentras!

There’s a library for that! GitPython

¿Sabes que puedes hacer una automatización de Git con Python? Mi más reciente descubrimiento se llama GitPython. Es una librería para poder realizar, como su nombre indica, llamadas a git desde dentro de python. Y cuando digo llamadas a git, no solo llamadas simples y típicas de git, sino todas las llamadas que se te ocurran. Desde hacer un add de un fichero editado, hasta ver el reflog para descubrir donde se quedo cierto cambio, si quieres hacerlo, aquí tienes la posibilidad. Lógicamente, te puedes plantear cuantas de estas herramientas son útiles para poder manejar desde un programa. Git es una herramienta con la cual tienes que interaccionar como persona, para poder procesar la salida de log, status y reflog, y ver que tienes que hacer con dicha información. La idea de ejecutar reflog y reset desde un programa me resulta bastante inútil. Cierto es que podrías saber que mensaje de commit utilizaste en el punto al que quieres volver, pero , a mi gusto, no es una tarea automatizable hasta el punto de poder desear un programa que te realize dicha acción. Las posibilidades que ofrece esta herramienta las veo , por una parte, orientadas al registro del estado de git en ciertos momentos, y por otra, muy potentes cuando se combinan con otras herramientas ofrecidas por python. Se nos abre la posibilidad de, con la ejecución de un programa, enviarle el log de tu repositorio de git a tu colaborador que no tiene plenos accesos a dicho repositorio, o generar un zip con el contenido de un tag en concreto con el objetivo guardar dicha versión para alguna futura referencia o envío. Otra utilidad que le veo a dicha herramienta es la realización de addscommits periódicos para realizar un guardado cada cierto tiempo y así protegernos de desarrolladores despistados que se olvidan del commit en el momento menos apropiado, que seguro que todos conocemos alguno. Ahora bien, si te pones el disfraz de científico loco y le echas imaginación, puedes hacer mucho más:
  • Crear tu propio gitHub usando GitPython y Django.
  • Usar git como capa de persistencia (¡con versiones!) para un proyecto en Python
  • Crear un «wrapper» que implementa un workflow específico de git
¡El límite lo pone tu nivel de frikismo!
nerd_Automatización de Git con Python
¡Se me ha ocurrido una idea genial para automatizar git en la Raspberry Pi que tengo en el baño!

Instalación de GitPython mediante PIP

Para utilizar esta librería, lo primero que tienes que hacer es instalarla. Utilizando pip, es así de sencillo:
sudo pip install gitpython
Tras esto, importas el módulo en tu programa y tienes vía libre. Puedes inicializar tu repositorio indicando la ruta al directorio, o si está en un repositorio remoto, realizando el clone necesario:
import git

#Local repo on your computer
repoLocal = git.Repo( '/route/to/git/repo' )
#Clone repo from bitbucket to a specific directory
repoCloned = git.Repo.clone_from(repoURL, "repo_directory_name")
En las variables repoLocal y repoCloned tenemos una instancia del repositorio, para poder acceder a las funcionalidades de git de dichos repositorios. Para acceder a ellos, procedemos de la siguiente forma:
print repo.git.status()
repo.git.add("f3.txt")
repo.git.commit(m='Adding f3.txt via python')
print repo.git.log()
Viendo la salida del log, vemos que se ha añadido el fichero deseado al repositorio. En mi caso, he obtenido lo siguiente:
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	f3.txt
nothing added to commit but untracked files present (use "git add" to track)
commit 6a4d5dd80212e0a56fe4331a0bd1f9bfae94c767
Author: .. <..>
Date:   Tue Apr 1 13:31:23 2014 +0200

    Adding f3.txt via python

commit 77191a6f5ffed6f06baf548d79551029902ed0f3
Author: .. <..>
Date:   Tue Apr 1 13:25:52 2014 +0200

    Adding f2.txt

commit 7cd9668fb8880e56fd1b0c6054cb59572fb17fc8
Author: .. <..>
Date:   Tue Apr 1 13:06:57 2014 +0200

    f1
Con el mismo procedimiento, podemos ver los branches o tags, hacer checkout a cualquiera de ellos y ver su contenido. Como ya comenté, eso de hacer adds y commits de cosas concretas mediante un programa me resulta poco útil dada su poca reusabilidad, pero la idea de hacer un zip con el contenido de cada tag de todos los repositorios que tenemos… eso es otra cuestión. Ahora bien, las frikadas que puedes perpetrar con un poco de imaginación, son épicas. Lo único que te hace falta son ganas de investigar un poco en python, y la realización de ese tipo de tareas horribles y repetitivas las podrás terminar en nada de tiempo. Lógicamente, me queda mucho por explorar de esta herramienta, pero su potencial en temas de hacer backups y automatizar ciertas tareas que implican un uso de git que, a mano, puede llevar horas, me resulta inmenso.