我想在Python脚本的输出中包含当前的git散列(作为生成该输出的代码的版本号)。
如何在我的Python脚本中访问当前的git哈希?
我想在Python脚本的输出中包含当前的git散列(作为生成该输出的代码的版本号)。
如何在我的Python脚本中访问当前的git哈希?
当前回答
我遇到了这个问题,并通过实现这个函数解决了它。 https://gist.github.com/NaelsonDouglas/9bc3bfa26deec7827cb87816cad88d59
from pathlib import Path
def get_commit(repo_path):
git_folder = Path(repo_path,'.git')
head_name = Path(git_folder, 'HEAD').read_text().split('\n')[0].split(' ')[-1]
head_ref = Path(git_folder,head_name)
commit = head_ref.read_text().replace('\n','')
return commit
r = get_commit('PATH OF YOUR CLONED REPOSITORY')
print(r)
其他回答
我遇到了类似于OP的问题,但在我的情况下,我将源代码作为zip文件交付给我的客户端,尽管我知道他们将安装python,但我不能假设他们将安装git。因为OP没有指定他的操作系统,如果他安装了git,我想我可以在这里贡献一下。
为了只获得提交的散列,Naelson Douglas的答案是完美的,但为了获得标记名称,我使用了dulwich python包。这是一个用python简化的git客户端。
在使用pip install dulwich——global-option="——pure"安装包后,可以这样做:
from dulwich import porcelain
def get_git_revision(base_path):
return porcelain.describe(base_path)
r = get_git_revision("PATH OF YOUR REPOSITORY's ROOT FOLDER")
print(r)
我刚刚在这里的一个存储库中运行了这段代码,它显示了输出v0.1.2-1-gfb41223,类似于git describe返回的结果,这意味着我在标记v0.1.2之后提交了一次,提交的7位哈希值是fb41223。
它有一些限制:目前它没有显示存储库是否脏的选项,它总是显示7位哈希,但不需要安装git,所以可以选择折衷。
编辑:如果pip install命令由于选项——pure(问题在这里解释)而出现错误,请从两个可能的解决方案中选择一个:
首先安装Dulwich包的依赖项: PIP install urllib3 certificate && PIP install Dulwich——global-option="——pure" 安装时没有选择pure: pip Install dulwich。这将在您的系统中安装一些平台相关的文件,但它将提高包的性能。
如果你想要比哈希多一点的数据,你可以使用git-log:
import subprocess
def get_git_hash():
return subprocess.check_output(['git', 'log', '-n', '1', '--pretty=tformat:%H']).strip()
def get_git_short_hash():
return subprocess.check_output(['git', 'log', '-n', '1', '--pretty=tformat:%h']).strip()
def get_git_short_hash_and_commit_date():
return subprocess.check_output(['git', 'log', '-n', '1', '--pretty=tformat:%h-%ad', '--date=short']).strip()
关于格式化选项的完整列表-查看git log——help
不需要自己从git命令中获取数据。GitPython是一种很好的方式来做到这一点,还有很多其他git的东西。它甚至有对Windows的“尽最大努力”支持。
在pip安装gitpython之后你就可以做了
import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
使用这个库时需要考虑的一些问题。以下文件摘自gitpython.readthedocs.io
Leakage of System Resources GitPython is not suited for long-running processes (like daemons) as it tends to leak system resources. It was written in a time where destructors (as implemented in the __del__ method) still ran deterministically. In case you still want to use it in such a context, you will want to search the codebase for __del__ implementations and call these yourself when you see fit. Another way assure proper cleanup of resources is to factor out GitPython into a separate process which can be dropped periodically
本文包含该命令,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())