我有一个 python 项目,我正在使用 git 进行版本控制我想根据 PEP440 为每个提交设置一个唯一的版本号.
即我将使用以下版本编号 N(.N)*[{a|b|rc}N][.postN][.devN]
对于 master 分支,对于每个没有增加更高级别版本号的提交 devN
将在提交时由 git 自动递增,其余版本有望由特殊的 git 命令控制:git increment-version {level}
其中 level 是 major
之一, minor
, patch
, patch-{level}
( patch
与 patch-0
相同),alpha
, beta
, release
, final
, post
将映射到版本字符串为 {major}[.{minor}[(.{patch-N})*]]
, alpha => aN
, beta => bN
, release => rcN
, post => postN
, 与 beta
替换 alpha
和 release
替换 beta
, final
删除预发布组件,如果使用比当前更早的组件,这应该会产生错误,当更高级别的版本增加时,所有较低级别都归零,并且任何设置为零的补丁级别都不包含在字符串中,递增 major
, minor
或 patch
将每个版本的组件设置为 a0
.
对于从主分支分支出来的分支,将使用相同的数字,但版本适用于它自己的分支,版本字符串为{master_version}+{branch_name}.{branch_version}
其中分支版本采用与主版本相同的格式
对于非主分支的分支,本地版本扩展如下{branchN_name}.{branchN_version}(.{branchN_name}.{branchN_version})*
其中分支名称必须以字母开头并且不匹配任何 [{a|b|rc}N][.postN][.devN],每个 {branchN_name}.{branchN_version}
被视为 .postN
的扩展形式零件
版本字符串的位置应指定为作为存储库一部分的文件,以及使用带有转义序列的字符串的如下行模式\\ = \
, \" = "
, \' = '
, \v = version string
即"__version__ = \"\v\""
.
在提交时,git 应该在指定文件中搜索此行,加载版本字符串,更新它并将新的版本字符串写入文件,中间在提交更改之前,包括更新的版本字符串,如果文件有其他更改,但是未添加到提交中,版本,字符串应该更新,在上一次提交的版本中,并且此更改传播到修改后的文件。如果 a 在 master 分支上,并且版本号已通过调用 git increment-version {level}
递增
比 git 还应该为此提交生成一个与版本字符串匹配的标签。
理想情况下,我想通过作为其自身存储库一部分的 python 脚本将此扩展增加到 git。但是,我对解决此问题的其他方法持开放态度。
编辑:
我相信最好的解决方案是使 git 命令,即 git-autoversion 可执行。
然后要为存储库启用所述版本控制,我将运行 git autoversion --init --style=pep440 --template=python-info --versionfile=XXX/_info.py
这将创建一个文件 .gitautoversion
这将包含
[autoversion]
version=1.0
local=
style=pep440
template=python-info
file=XXX/_info.py
它也会有一个钩子(Hook)
git autoversion --commit
它应该作为预提交钩子(Hook)运行。最后它可以称为
git autoversion --[major|minor|patch{-level}|alpha|beta|release|final|post|dev]
可用于标记要递增的版本号,只有最后一次调用才会计算这将添加行 increment=xxx
到.gitautoversion
配置文件,命令git autoversion --commit
将读取此内容并增加版本,如果未指定增量,则默认为 dev,最后调用命令 git-autoversion-tpl-{template} --version={version} --local={local} --file={file}
更新版本文件。问题:当安装自动版本以调用
git autoversion --commit
时,他们是安装全局 git Hook 的一种方式吗?对于任何存储库的提交,此命令可以检查 .gitautoversion
如果找到更新版本,否则什么也不做。如果不是,这将需要手动安装 Hook 。问题 2:他们是否可以将额外的参数 Hook 到
git commit
? ,比如说--autoversion=[major|minor|patch{-level}|alpha|beta|release|final|post|dev]
,它会在运行提交 Hook 之前调用 autoversion 命令?
最佳答案
您也许可以使用 version_scheme
以下pypi项目中的选项来做你想做的事
https://pypi.python.org/pypi/setuptools_scm
关于python - 在提交时使用 git 自动更新版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45399398/