280 votes

Obtenir le hash git actuel dans un script Python.

J'aimerais inclure le hachage git actuel dans la sortie d'un script Python (comme un le numéro de version du code qui a généré cette sortie).

Comment puis-je accéder au hash git actuel dans mon script Python ?

8 votes

Commencez par git rev-parse HEAD à partir de la ligne de commande. La syntaxe de sortie devrait être évidente.

6 votes

Faire subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode('ascii').strip() après avoir import subprocess

315voto

Kasper Souren Points 1029

Il n'est pas nécessaire d'aller chercher les données dans le git commandez-vous. GitPython est une très bonne façon de faire cela et beaucoup d'autres choses. git des trucs. Il a même un support "best effort" pour Windows.

Après pip install gitpython vous pouvez faire

import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha

Un élément à prendre en compte lors de l'utilisation de cette bibliothèque. Ce qui suit est tiré de gitpython.readthedocs.io

Fuite des ressources du système

GitPython n'est pas adapté aux processus longs (comme les démons) car il a tendance à gaspiller les ressources du système. Il a été écrit à une époque où les destructeurs (tels qu'ils sont implémentés dans le module __del__ ) s'exécute toujours de manière déterministe.

Si vous souhaitez toujours l'utiliser dans un tel contexte, vous devrez rechercher dans le codebase les éléments suivants __del__ et les appeler vous-même lorsque vous le jugez nécessaire.

Une autre façon d'assurer un nettoyage correct des ressources est de factoriser GitPython dans un processus séparé qui peut être abandonné périodiquement.

193voto

Yuji 'Tomita' Tomita Points 46106

Ce poste contient la commande, La réponse de Greg contient la commande de sous-processus.

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()

en cours d'exécution

print(get_git_revision_hash())
print(get_git_revision_short_hash())

vous obtenez un résultat :

fd1cd173fc834f62fa7db3034efc5b8e0f3b43fe
fd1cd17

126voto

Greg Hewgill Points 356191

El git describe est un bon moyen de créer un "numéro de version" du code qui soit présentable par l'homme. D'après les exemples de la documentation :

Avec quelque chose comme git.git current tree, j'obtiens :

[torvalds@g5 git]$ git describe parent
v1.0.4-14-g2414721

Par exemple, la tête actuelle de ma branche "parent" est basée sur la v1.0.4, mais comme elle a quelques commits en plus, describe a ajouté le nombre de commits supplémentaires ("14") et un nom d'objet abrégé pour le commit lui-même ("2414721") à la fin.

À partir de Python, vous pouvez faire quelque chose comme ce qui suit :

import subprocess
label = subprocess.check_output(["git", "describe"]).strip()

19voto

AndyP Points 543

Voici une version plus complète de La réponse de Greg :

import subprocess
print(subprocess.check_output(["git", "describe", "--always"]).strip().decode())

Ou, si le script est appelé depuis l'extérieur du repo :

import subprocess, os
print(subprocess.check_output(["git", "describe", "--always"], cwd=os.path.dirname(os.path.abspath(__file__))).strip().decode())

Ou bien, si le script est appelé depuis l'extérieur du repo et que vous souhaitez pathlib :

import subprocess
from pathlib import Path
print(subprocess.check_output(["git", "describe", "--always"], cwd=Path(__file__).resolve().parent).strip().decode())

18voto

kagronick Points 854

Si subprocess n'est pas portable et que vous ne voulez pas installer un paquet pour faire quelque chose d'aussi simple, vous pouvez aussi faire ceci.

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()

Je ne l'ai testé que sur mes dépôts mais cela semble fonctionner de manière assez cohérente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X