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 ?
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 ?
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.
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
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()
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())
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 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.
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 avoirimport subprocess