то есть текущий заголовок моей «родительской» ветви основан на v1.0.4, но так как он имеет несколько коммитов, к ним добавлено число дополнительных коммитов («14») и сокращенное имя объекта для фиксации. сам ("2414721") в конце.
Из Python вы можете сделать что-то вроде следующего:
Это имеет тот недостаток, что код печати версии будет нарушен, если код будет запущен без git-репозитория. Например, в производстве. :)
JosefAssad
5
@JosefAssad: Если вам нужен идентификатор версии в рабочей среде, тогда ваша процедура развертывания должна запускать вышеуказанный код, и результат должен быть «внедрен» в код, развернутый в рабочей среде.
Грег Хьюгилл
15
Обратите внимание, что git fatal: No names found, cannot describe anything.
description
41
git describe --alwaysбудет возвращаться к последнему коммиту, если теги не найдены
Leonardo
5
@CharlieParker: git describeобычно требуется хотя бы один тег. Если у вас нет тегов, используйте --alwaysопцию. Смотрите документацию git description для получения дополнительной информации.
Грег Хьюгилл
190
Не нужно взламывать получение данных от gitкоманды самостоятельно. GitPython - это очень хороший способ сделать это и многое другое git. У него даже есть поддержка "наилучшего усилия" для Windows.
После pip install gitpythonтого, как вы можете сделать
@crishoj Не знаю , как можно назвать портативным , когда это произойдет: ImportError: No module named gitpython. Вы не можете полагаться на то, что конечный пользователь gitpythonустановил его, и требование того, чтобы он установил его до того, как ваш код заработает, сделает его не переносимым. Если вы не собираетесь включать протоколы автоматической установки, с этого момента это уже не является чистым решением.
user5359531
39
@ user5359531 Прошу отличаться. GitPython предоставляет чистую реализацию Python, абстрагируясь от специфических для платформы деталей, и его можно установить с помощью стандартных инструментов пакета ( pip/ requirements.txt) на всех платформах. Что не "чисто"?
crishoj
22
Это нормальный способ делать вещи в Python. Если ОП нуждается в этих требованиях, они бы так и сказали. Мы не читатели мыслей, мы не можем предсказать каждую возможность в каждом вопросе. Так лежит безумие.
OldTinfoil
14
@ user5359531, мне непонятно, почему import numpy as npможно предположить, что такое весь стекопоток, но установка gitpython выходит за рамки «чистого» и «портативного». Я думаю, что это, безусловно, лучшее решение, потому что оно не изобретает колесо, скрывает уродливую реализацию и не пытается взломать ответ git из подпроцесса.
Jblasco
7
@ user5359531 Хотя я в целом согласен с тем, что не следует бросать блестящую новую библиотеку на каждую небольшую проблему, ваше определение «переносимости», похоже, игнорирует современные сценарии, когда разработчики имеют полный контроль над всеми средами, в которых работают приложения. В 2018 году мы Контейнеры Docker, виртуальные среды и образы машин (например, AMI) с pipвозможностью простой установки pip. В этих современных сценариях pipрешение столь же переносимо, как и решение «стандартной библиотеки».
import os
import subprocess
# Return the git revision as a stringdef git_version():def _minimal_ext_cmd(cmd):# construct minimal environment
env ={}for k in['SYSTEMROOT','PATH']:
v = os.environ.get(k)if v isnotNone:
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')exceptOSError:
GIT_REVISION ="Unknown"return GIT_REVISION
Мне нравится это, довольно чистый и без внешних библиотек
13aal
Ответ Юджи дает аналогичное решение только в одной строке кода, которая дает тот же результат. Можете ли вы объяснить, почему numpyсчел необходимым «построить минимальную среду»? (при условии, что у них были веские причины)
MD004
Я просто заметил это в своем репо и решил добавить его в этот вопрос для интересующихся людей. Я не занимаюсь разработкой в Windows, поэтому я не проверял это, но я предполагал, что настройка envdict была необходима для кросс-платформенной функциональности. Ответ Юджи - нет, но, возможно, это работает как в UNIX, так и в Windows.
ryanjdillon
Глядя на вину git, они сделали это как исправление ошибки для SVN 11 лет назад: github.com/numpy/numpy/commit/… Возможно, исправление ошибки больше не нужно для git.
родитель
@ MD004 @ryanjdillon Они устанавливают локаль так, чтобы она работала, .decode('ascii')иначе кодировка неизвестна.
z0r
7
Если подпроцесс не переносим и вы не хотите устанавливать пакет, чтобы сделать что-то такое простое, вы также можете сделать это.
Вместо того , чтобы использовать os.chdir, то cwd=аргумент может быть использован в check_outputвременные изменения в рабочем каталоге перед выполнением.
Марк
0
Если по какой-то причине у вас нет git, но у вас есть git-репозиторий (найдена папка .git), вы можете получить хеш коммита из .git / fetch /heads / [branch]
Например, я использовал следующий быстрый и грязный фрагмент Python, запускаемый в корне хранилища, чтобы получить идентификатор фиксации:
git_head ='.git\\HEAD'# Open .git\HEAD file:with open(git_head,'r')as git_head_file:# Contains e.g. ref: ref/heads/master if on "master"
git_head_data = str(git_head_file.read())# Open the correct file in .git\ref\heads\[branch]
git_head_ref ='.git\\%s'% git_head_data.split(' ')[1].replace('/','\\').strip()# Get the commit hash ([:7] used to get "--short")with open(git_head_ref,'r')as git_head_ref_file:
commit_id = git_head_ref_file.read().strip()[:7]
git rev-parse HEAD
командной строки. Синтаксис вывода должен быть очевидным.Ответы:
Команда
git describe
- это хороший способ создания презентабельного «номера версии» кода. Из примеров в документации:Из Python вы можете сделать что-то вроде следующего:
источник
fatal: No names found, cannot describe anything.
git describe --always
будет возвращаться к последнему коммиту, если теги не найденыgit describe
обычно требуется хотя бы один тег. Если у вас нет тегов, используйте--always
опцию. Смотрите документацию git description для получения дополнительной информации.Не нужно взламывать получение данных от
git
команды самостоятельно. GitPython - это очень хороший способ сделать это и многое другоеgit
. У него даже есть поддержка "наилучшего усилия" для Windows.После
pip install gitpython
того, как вы можете сделатьисточник
ImportError: No module named gitpython
. Вы не можете полагаться на то, что конечный пользовательgitpython
установил его, и требование того, чтобы он установил его до того, как ваш код заработает, сделает его не переносимым. Если вы не собираетесь включать протоколы автоматической установки, с этого момента это уже не является чистым решением.pip
/requirements.txt
) на всех платформах. Что не "чисто"?import numpy as np
можно предположить, что такое весь стекопоток, но установка gitpython выходит за рамки «чистого» и «портативного». Я думаю, что это, безусловно, лучшее решение, потому что оно не изобретает колесо, скрывает уродливую реализацию и не пытается взломать ответ git из подпроцесса.pip
возможностью простой установкиpip
. В этих современных сценарияхpip
решение столь же переносимо, как и решение «стандартной библиотеки».Этот пост содержит команду, а ответ Грега содержит команду подпроцесса.
источник
.decode('ascii').strip()
для декодирования двоичной строки (и удалите разрыв строки).numpy
имеет симпатичный мультиплатформенную рутину в своемsetup.py
:источник
numpy
счел необходимым «построить минимальную среду»? (при условии, что у них были веские причины)env
dict была необходима для кросс-платформенной функциональности. Ответ Юджи - нет, но, возможно, это работает как в UNIX, так и в Windows..decode('ascii')
иначе кодировка неизвестна.Если подпроцесс не переносим и вы не хотите устанавливать пакет, чтобы сделать что-то такое простое, вы также можете сделать это.
Я только протестировал это на своих репозиториях, но, похоже, работает довольно стабильно.
источник
Вот более полная версия ответа Грега :
Или, если скрипт вызывается из-за пределов репо:
источник
os.chdir
, тоcwd=
аргумент может быть использован вcheck_output
временные изменения в рабочем каталоге перед выполнением.Если по какой-то причине у вас нет git, но у вас есть git-репозиторий (найдена папка .git), вы можете получить хеш коммита из .git / fetch /heads / [branch]
Например, я использовал следующий быстрый и грязный фрагмент Python, запускаемый в корне хранилища, чтобы получить идентификатор фиксации:
источник