我想包括在Python脚本的输出的电流的git散列(如生成该输出的代码的版本号 )。
我怎样才能访问当前的git散在我的Python脚本?
我想包括在Python脚本的输出的电流的git散列(如生成该输出的代码的版本号 )。
我怎样才能访问当前的git散在我的Python脚本?
在git describe
命令创建代码的人像样的“版本号”的一个好办法。 从文档中的例子:
随着像git.git当前树,我得到:
[torvalds@g5 git]$ git describe parent v1.0.4-14-g2414721
即我的“父母”分支现任掌门基于v1.0.4,但由于它具有最重要的是几个提交,描述增加了额外的提交(“14”)的提交数量和缩写对象名称本身末(“2414721”)。
从内Python中,你可以做类似如下:
import subprocess
label = subprocess.check_output(["git", "describe"]).strip()
无需破解各地从获取数据git
命令自己。 GitPython是一个非常好的办法做到这一点和很多其他的git
东西。 它甚至有用于Windows的“尽力而为”的支持。
之后pip install gitpython
你可以做
import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
这篇文章包含命令, 格雷格的回答包含子命令。
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'])
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
如果子进程是不可移植的,你不希望安装一个软件包做一些这个简单,你也可以做到这一点。
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()
我只测试了这个在我的回购协议,但它似乎很consistantly工作。