Получить текущий хэш git в Python script

Я хочу включить текущий вывод git в вывод Python script (в качестве номера версии кода, сгенерировавшего этот вывод).

Как я могу получить доступ к текущему хешу git в моем Python script?

Ответ 1

Команда git describe - хороший способ создания презентабельного "номера версии" кода. Из примеров в документации:

С чем-то вроде текущего дерева git.git я получаю:

[[email protected] git]$ git describe parent
v1.0.4-14-g2414721

то есть текущий заголовок моей "родительской" ветки основан на v1.0.4, но так как он имеет несколько коммитов, к ним добавлено число дополнительных коммитов ("14") и сокращенное имя объекта для фиксации. сам ("2414721") в конце.

Из Python вы можете сделать что-то вроде следующего:

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

Ответ 2

Не нужно взламывать получение данных из команды git самостоятельно. GitPython - это очень хороший способ сделать это и множество других git. У него даже есть поддержка "наилучшего усилия" для Windows.

После pip install gitpython вы можете сделать

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

Ответ 3

Этот пост содержит команду, Greg answer содержит команду subprocess.

import subprocess

def get_git_revision_hash():
    return subprocess.check_output(['git', 'rev-parse', 'HEAD'])

def get_git_revision_short_hash():
    return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD'])

Ответ 4

numpy имеет симпатичную многоплатформенную подпрограмму в setup.py:

import os
import subprocess

# Return the git revision as a string
def git_version():
    def _minimal_ext_cmd(cmd):
        # construct minimal environment
        env = {}
        for k in ['SYSTEMROOT', 'PATH']:
            v = os.environ.get(k)
            if v is not None:
                env[k] = v
        # LANGUAGE is used on win32
        env['LANGUAGE'] = 'C'
        env['LANG'] = 'C'
        env['LC_ALL'] = 'C'
        out = subprocess.Popen(cmd, stdout = subprocess.PIPE, env=env).communicate()[0]
        return out

    try:
        out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD'])
        GIT_REVISION = out.strip().decode('ascii')
    except OSError:
        GIT_REVISION = "Unknown"

    return GIT_REVISION

Ответ 5

Если подпроцесс не переносим и вы не хотите устанавливать пакет, чтобы сделать что-то такое простое, вы также можете сделать это.

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

Я только протестировал это на своих репозиториях, но, похоже, работает довольно стабильно.

Ответ 6

Вот более полная версия ответа Грега:

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

Или, если скрипт вызывается из-за пределов репо:

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