如何用git重写python __version__?

bte*_*tel 43 python git

我想__version__在我的模块中定义一个变量,它应该在git commit上自动更新,类似于SVN关键字的功能.有没有办法在Git中实现它?有没有人有一个有效的例子?

我考虑使用GitPython,但我不想引入另一个依赖项,我希望用户从SVN repo或zip包下载模块具有相同的版本控制方案(我不在乎这是一些难以理解的哈希).

编辑:我的特殊问题是我必须运行模拟,其结果取决于模拟脚本的确切版本.因此,每次我必须将版本号与模拟结果一起存储.如果两者都不同步,则可能会产生非常可怕的结果.

Cas*_*bel 32

最好将此作为包装的一部分,而不是在每次提交后执行.

有两个主要选项:

  • 使用git-archive到包装,并使用export-subst属性.不幸的是,您可以替代的东西仅限于占位符git log --format=....例如,您可以__version__ = $Format:%H$在您的文件中写入,放入<filename> export-subst.gitattributes,并在运行git archive时,将其更改为您要归档的提交的完整哈希值.这只是你要求的,但我更喜欢下一个选项.

  • 自己做它作为打包过程的一部分(通常是编译包的构建过程)和使用git describe.这将为你提供一个漂亮的漂亮字符串v1.7.4.1-59-ge3d3f7d,意思是"59提交超过标记v1.7.4.1,在提交时ge3d3f7d",然后你可以在打包/构建时以某种方式插入代码中的正确位置.这就是Git本身所做的事情; 结果被转储到一个文件,其内容被读入makefile,然后通过-D预处理器选项传递给构建,并直接放入各种文件名(例如发布tarball).

如果你真的,真的想在每次提交后都这样做,你可以使用post-commit钩子,但是只有你(以及你提供钩子的那些)才能拥有它,而且很可能会失去同步 - 你还必须有一个结账后挂钩,依此类推.对于创建需要此版本号的任何进程来自己获取它真的更好.

你也可以使用涂抹/清洁过滤器,它更像你真正想要的(而不是简单地在每次提交后).


Pin*_*ino 11

除了 Versioneer 之外的另一种可能性是setuptools_scm.

通过添加以下内容setup.py(或相应地修改它),我已经成功地实现了与 OP 非常相似的东西:

from setuptools import setup
setup(
    ...,
    use_scm_version=True,
    setup_requires=['setuptools_scm'],
    ...,
)
Run Code Online (Sandbox Code Playgroud)

并且,为了__version__自动更新,将此添加到__init__.py我的包中:

from pkg_resources import get_distribution, DistributionNotFound
try:
    __version__ = get_distribution(__name__).version
except DistributionNotFound:
    # package is not installed
    pass
Run Code Online (Sandbox Code Playgroud)


jpy*_*ams 5

对于那些在2018年发现此问题的人,您还可以使用Versioneer。启用后,它将version在构建时根据最新的Git标签自动在模块中setup.py__version__模块中设置。

例如,如果您在标记处构建项目1.0.0,则Versioneer会将项目的版本设置为1.0.0。如果再执行两次提交,则无需检入就进行编辑,然后进行构建,Versioneer会将版本设置为1.0.0+2.g1076c97.dirty

当然,您可以自定义Versioneer将哪些标签识别为版本标签。

这也是大型项目(例如pandasmatplotlib)如何处理其版本控制的方式。