Obtenga el hash de git actual en un script de Python

Resuelto Victor asked hace 11 años • 12 respuestas

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?

Victor avatar Feb 21 '13 04:02 Victor
Aceptado

No es necesario piratear para obtener datos del gitcomando usted mismo. GitPython es una forma muy buena de hacer esto y muchas otras gitcosas. Incluso tiene soporte de "mejor esfuerzo" para Windows.

Después de que pip install gitpythonpuedas 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.

the avatar Dec 18 '2016 16:12 the

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
Yuji 'Tomita' Tomita avatar Feb 20 '2014 07:02 Yuji 'Tomita' Tomita

El git describecomando 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()
Greg Hewgill avatar Feb 20 '2013 21:02 Greg Hewgill

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())
mathandy avatar Aug 28 '2019 00:08 mathandy

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.

kagronick avatar May 21 '2019 20:05 kagronick