如何用git archive替换QGIS插件代码中的SHA1版本号?
解决QGIS插件部署时自动替换Git版本号的问题
这里提供几个实用方案,帮你在部署插件时自动把__revision__替换成对应Git版本号,替代单纯的文件复制:
方案1:用git archive直接提取到目标目录(无需生成归档文件)
Git archive本身支持将内容输出到标准输出,配合tar可以直接提取到指定目录,同时自动完成版本号替换(前提是你的__revision__变量是__revision__ = "$Format:%H$"这种Git可识别的格式)。
执行命令:
git archive <目标版本> | tar -x -C /path/to/qgis/plugins/你的插件目录
- 把
<目标版本>换成具体的commit哈希、分支名或标签,比如HEAD(当前分支最新版本)、v1.2.3(标签)。 - 这个命令会把Git已跟踪的文件直接解压到QGIS插件目录,同时
__revision__会被替换为对应版本的SHA1值,完全跳过归档文件生成步骤。
方案2:本地替换版本号后再复制
如果需要包含未跟踪的文件(比如临时配置),或者不想用git archive,可以先批量替换Python文件里的版本号,再复制到插件目录:
- 获取当前Git版本号(短哈希,也可以用
--long获取完整SHA):
GIT_SHA=$(git rev-parse --short HEAD)
- 批量替换所有Python文件中的
__revision__:
find /你的插件源码目录 -name "*.py" -exec sed -i "s/__revision__ = \".*\"/__revision__ = \"$GIT_SHA\"/g" {} +
- 复制文件到QGIS插件目录(用rsync或cp都可以):
rsync -av --exclude='.git' /你的插件源码目录/ /path/to/qgis/plugins/你的插件目录/
方案3:给pb_tool添加自定义部署任务
既然你正在用pb_tool,可以把替换逻辑整合到pb_tool的命令中,修改pb_tool.cfg文件,在[commands]部分添加自定义任务:
[commands] deploy_with_rev = !GIT_SHA=$(git rev-parse --short HEAD) && find . -name "*.py" -exec sed -i "s/__revision__ = \".*\"/__revision__ = \"$GIT_SHA\"/g" {} + && pb_tool deploy
之后只需运行pb_tool deploy_with_rev,就能自动完成版本号替换+部署的流程。
注意事项
- 确保所有Python文件中的
__revision__格式统一,比如都是__revision__ = "xxx"的形式,否则替换命令可能失效。 - Windows环境下,上述bash命令需要在Git Bash或WSL中执行;如果用PowerShell,替换命令可以改成:
$GIT_SHA = git rev-parse --short HEAD Get-ChildItem -Recurse -Filter *.py | ForEach-Object { (Get-Content $_.FullName) -replace '__revision__ = ".*"', "__revision__ = `"$GIT_SHA`"" | Set-Content $_.FullName } - git archive方式只会处理Git已跟踪的文件,未提交的修改或未跟踪文件不会被包含,这种情况优先选方案2。
内容的提问来源于stack exchange,提问作者Honeybear
相关产品推荐
相关产品推荐

