我想在Python脚本的输出中包含当前的git散列(作为生成该输出的代码的版本号)。
如何在我的Python脚本中访问当前的git哈希?
我想在Python脚本的输出中包含当前的git散列(作为生成该输出的代码的版本号)。
如何在我的Python脚本中访问当前的git哈希?
当前回答
本文包含该命令,Greg的回答包含subprocess命令。
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()
运行时
print(get_git_revision_hash())
print(get_git_revision_short_hash())
你得到输出:
fd1cd173fc834f62fa7db3034efc5b8e0f3b43fe
fd1cd17
其他回答
git describe命令是创建适合人类的代码“版本号”的好方法。参考文档中的例子:
和像少年犯一样的东西。git当前树,我得到: [torvalds@g5 git]$ git描述父 v1.0.4-14-g2414721 例如,我的“父”分支的当前头基于v1.0.4,但由于它在此之上有一些提交,describe在最后添加了额外提交的数量(“14”)和提交本身的缩写对象名称(“2414721”)。
在Python内部,你可以做如下的事情:
import subprocess
label = subprocess.check_output(["git", "describe"]).strip()
本文包含该命令,Greg的回答包含subprocess命令。
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()
运行时
print(get_git_revision_hash())
print(get_git_revision_short_hash())
你得到输出:
fd1cd173fc834f62fa7db3034efc5b8e0f3b43fe
fd1cd17
下面是格雷格更完整的回答:
import subprocess
print(subprocess.check_output(["git", "describe", "--always"]).strip().decode())
或者,如果脚本从repo外部被调用:
import subprocess, os
print(subprocess.check_output(["git", "describe", "--always"], cwd=os.path.dirname(os.path.abspath(__file__))).strip().decode())
或者,如果脚本是从repo外部调用的,而你喜欢pathlib:
import subprocess
from pathlib import Path
print(subprocess.check_output(["git", "describe", "--always"], cwd=Path(__file__).resolve().parent).strip().decode())
如果您由于某些原因没有可用的Git,但您有Git repo(。),你可以从. Git /fetch/heads/[branch]中获取提交哈希。
例如,我在存储库根运行了下面的Python代码片段来获得提交id:
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]
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