如何为Python脚本自动生成Git关联的唯一构建版本号?
实现脚本版本唯一标识的常规方式
以下是几种常见的实现方案,可根据你的场景选择:
直接读取Git提交哈希
Git的提交哈希是全局唯一的,脚本启动时通过调用Git命令获取当前仓库HEAD的哈希值,作为版本标识:
import subprocess def get_git_hash(): try: # 获取完整哈希(唯一度更高) full_hash = subprocess.check_output(['git', 'rev-parse', 'HEAD'], stderr=subprocess.STDOUT, text=True).strip() # 获取短哈希(更易阅读) short_hash = subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD'], stderr=subprocess.STDOUT, text=True).strip() return f"完整SHA: {full_hash} | 短SHA: {short_hash}" except subprocess.CalledProcessError: return "无法获取Git版本信息(当前目录非Git仓库或未安装Git)" # 脚本开头打印版本 print(f"当前运行脚本版本: {get_git_hash()}")
优势:无需额外配置,哈希直接对应Git提交记录,能精准定位版本。
结合Git标签与提交哈希
如果平时会给重要提交打版本标签(如v1.2.3),可以将标签与哈希组合,让版本信息更直观:
import subprocess def get_git_version(): try: # 获取最近的正式版本标签 latest_tag = subprocess.check_output(['git', 'describe', '--abbrev=0', '--tags'], stderr=subprocess.STDOUT, text=True).strip() # 获取带提交偏移的完整标识(如v1.2.3-2-gabc123) full_desc = subprocess.check_output(['git', 'describe', '--tags'], stderr=subprocess.STDOUT, text=True).strip() return f"版本标签: {latest_tag} | 完整标识: {full_desc}" except subprocess.CalledProcessError: # 无标签时 fallback到哈希 return get_git_hash() print(f"当前运行脚本版本: {get_git_version()}")
输出示例:版本标签: v1.2.3 | 完整标识: v1.2.3-2-gabc123,其中2表示标签后有2次提交,abc123为短哈希,能清晰看出当前版本与正式标签的差异。
部署时生成版本文件
如果虚拟机运行脚本前有部署环节,可以提前将版本信息写入单独文件,脚本直接导入读取,无需运行时依赖Git:
- 部署时执行命令生成
version.py:
# 写入短哈希、完整哈希和最近标签 echo "GIT_SHORT_SHA = '$(git rev-parse --short HEAD)'" > version.py echo "GIT_FULL_SHA = '$(git rev-parse HEAD)'" >> version.py echo "GIT_LATEST_TAG = '$(git describe --abbrev=0 --tags 2>/dev/null || echo "untagged")'" >> version.py
- 脚本中导入使用:
from version import GIT_SHORT_SHA, GIT_LATEST_TAG print(f"当前运行脚本版本: {GIT_LATEST_TAG} - {GIT_SHORT_SHA}")
优势:适合Git环境受限的场景,版本信息在部署时就固定,不会受运行期间仓库更新影响。
预提交钩子自动更新版本
本地开发时,用Git预提交钩子在每次提交前自动更新脚本内的版本变量:
- 在本地仓库的
.git/hooks/pre-commit文件中添加以下内容(记得给文件加执行权限chmod +x .git/hooks/pre-commit):
#!/bin/bash # 获取当前提交短哈希 SHORT_SHA=$(git rev-parse --short HEAD) # 替换脚本中的版本变量 sed -i.bak "s/^SCRIPT_VERSION = .*/SCRIPT_VERSION = '$SHORT_SHA'/" your_script.py # 将修改后的脚本加入提交 git add your_script.py
- 在脚本开头定义版本变量:
SCRIPT_VERSION = 'unknown' print(f"当前运行脚本版本: {SCRIPT_VERSION}")
这样每次提交时,脚本的版本号会自动同步为当前提交的短哈希,推送后虚拟机克隆的脚本就带有正确的版本标识。
注意
以上方案获取的都是脚本启动时的仓库版本,即使运行期间仓库被拉取新代码,也不会影响当前运行脚本的版本标识,符合你知晓"当前运行版本"的需求。
内容的提问来源于stack exchange,提问作者apt45
相关产品推荐
相关产品推荐

