Obtenga el hash de git actual en un script de Python
Me gustaría incluir el hash de git actual en la salida de un script de Python (como el número de versión del código que generó esa salida).
¿Cómo puedo acceder al hash de git actual en mi script de Python?
No es necesario piratear para obtener datos del git
comando usted mismo. GitPython es una forma muy buena de hacer esto y muchas otras git
cosas. Incluso tiene soporte de "mejor esfuerzo" para Windows.
Después de que pip install gitpython
puedas hacer
import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
Algo a considerar al usar esta biblioteca. Lo siguiente está tomado de gitpython.readthedocs.io
Fuga de recursos del sistema
GitPython no es adecuado para procesos de larga duración (como demonios), ya que tiende a perder recursos del sistema. Fue escrito en una época en la que los destructores (tal como se implementaban en el
__del__
método) todavía se ejecutaban de forma determinista.En caso de que aún desee usarlo en dicho contexto, querrá buscar
__del__
implementaciones en la base de código y llamarlas usted mismo cuando lo considere oportuno.Otra forma de garantizar una limpieza adecuada de los recursos es factorizar GitPython en un proceso separado que se puede eliminar periódicamente.
Esta publicación contiene el comando, la respuesta de Greg contiene el comando de subproceso.
import subprocess
def get_git_revision_hash() -> str:
return subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode('ascii').strip()
def get_git_revision_short_hash() -> str:
return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode('ascii').strip()
al correr
print(get_git_revision_hash())
print(get_git_revision_short_hash())
obtienes salida:
fd1cd173fc834f62fa7db3034efc5b8e0f3b43fe
fd1cd17
El git describe
comando es una buena manera de crear un "número de versión" del código presentable por humanos. De los ejemplos en la documentación:
Con algo como el árbol actual de git.git, obtengo:
[torvalds@g5 git]$ git describe parent v1.0.4-14-g2414721
es decir, el encabezado actual de mi rama "principal" se basa en v1.0.4, pero como tiene algunas confirmaciones además de eso, describe ha agregado la cantidad de confirmaciones adicionales ("14") y un nombre de objeto abreviado para la confirmación. sí mismo ("2414721") al final.
Desde Python, puedes hacer algo como lo siguiente:
import subprocess
label = subprocess.check_output(["git", "describe"]).strip()
Aquí hay una versión más completa de la respuesta de Greg :
import subprocess
print(subprocess.check_output(["git", "describe", "--always"]).strip().decode())
O, si el script se llama desde fuera del repositorio:
import subprocess, os
print(subprocess.check_output(["git", "describe", "--always"], cwd=os.path.dirname(os.path.abspath(__file__))).strip().decode())
O, si el script se llama desde fuera del repositorio y le gusta pathlib
:
import subprocess
from pathlib import Path
print(subprocess.check_output(["git", "describe", "--always"], cwd=Path(__file__).resolve().parent).strip().decode())
Si el subproceso no es portátil y no desea instalar un paquete para hacer algo tan simple, también puede hacerlo.
import pathlib
def get_git_revision(base_path):
git_dir = pathlib.Path(base_path) / '.git'
with (git_dir / 'HEAD').open('r') as head:
ref = head.readline().split(' ')[-1].strip()
with (git_dir / ref).open('r') as git_hash:
return git_hash.readline().strip()
Solo probé esto en mis repositorios, pero parece funcionar de manera bastante consistente.