在Python脚本中获取当前git哈希值

283 投票
12 回答
163447 浏览
提问于 2025-04-17 16:33

我想在一个Python脚本的输出中加入当前的git哈希值(作为生成这个输出的代码的版本号)。

我该如何在我的Python脚本中获取当前的git哈希值呢?

12 个回答

197

这篇帖子里有一个命令,Greg的回答里有关于子进程命令的内容。

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
317

你不需要自己去搞定从 git 命令获取数据的麻烦。GitPython 是个很不错的工具,可以帮助你做这些事情,还有很多其他的 git 相关操作。它甚至对 Windows 也有“尽力而为”的支持。

安装完 gitpython 后,你可以这样做:

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

使用这个库时,有些事情需要注意。以下内容摘自 gitpython.readthedocs.io

系统资源泄露

GitPython 不适合用于长时间运行的进程(比如守护进程),因为它可能会导致系统资源泄露。它是在一个当时析构函数(在 __del__ 方法中实现的)能够可靠运行的时代写的。

如果你还是想在这种情况下使用它,你需要在代码中查找 __del__ 的实现,并在合适的时候自己调用这些方法。

另一种确保资源正确清理的方法是把 GitPython 放到一个单独的进程中,这样可以定期清理。

127

git describe 命令是一个很好的方法,可以生成一个人类易读的“版本号”来表示代码的状态。根据文档中的例子:

在当前的代码树上,我得到:

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

撰写回答