¿Qué encontrarás en este post?
ToggleAutomatizació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.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 adds y commits 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
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 gitpythonTras 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 f1Con 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.