在Python脚本中获取当前git哈希值
我想在一个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()