19

我正在尝试使用 GitPython lib 获取 repo 中的最新标签。通常我是这样做的:

repo = Repo(project_root)
last_tag = str(repo.tags[-1])

但是一旦版本 1.10 发布,我总是得到 1.9 ;( 我知道这与输出git tag -l列出相同的顺序有关。所以它将是1.1, 1.10, 1.2, ..., 1.9

问题是如何使用 GitPython 获取最新的标签?(我知道git tag -l | sort -V并且我知道如何不使用 repo 对象来解决这个问题。但也许有人知道我在这个库中获取排序标签列表时缺少什么)

自定义排序功能也始终是一个选项,但是,我想知道是否有办法使用 GitPython 做到这一点?

4

4 回答 4

23

IterableListGitPython 中返回的对象repo.tags继承自listpython 类,这意味着您可以按照自己的方式对其进行排序。要创建最新的标签,您可以简单地执行以下操作:

import git
repo = git.Repo('path/to/repo')
tags = sorted(repo.tags, key=lambda t: t.commit.committed_datetime)
latest_tag = tags[-1]
于 2017-02-14T12:17:20.777 回答
4

我刚刚看了看,发现负责排序的代码。因此,除了自己颠倒排序顺序外,我别无他法,例如

reversed(repo.tags)

如果愿意,您还可以使用底层 git 命令,并自己解析结果,例如在此示例中:

repo.git.tag(l=True) # equals git tag -l

这样,无论git tag您能做什么,您都可以做(从给定的提交开始,按遍历顺序列出标签可能很有趣)。

于 2014-08-11T20:32:18.620 回答
4

如果有与标签相关的不同提交(通常是这种情况),上述方法将起作用。然而,更准确的方法如下获取标签日期:

import git
repo = git.Repo('path/to/repo')
tags = sorted(repo.tags, key=lambda t: t.tag.tagged_date)
latest_tag = tags[-1]
于 2017-07-11T10:12:04.377 回答
2

排序是按字母数字顺序进行的,因此“1.9”的排名高于“1.10”,因为它是按字符排序且“9”>“1”。

如果您想要更明智的排序,您有两个选择:将您的版本号填零(1.09 而不是 1.9),这将是首选,但事后很难实现。

另一个是在python中对标签进行排序。有一个名为natsort的库可以对各种数据进行自然排序。但是对于这个简单的情况,您还可以使用排序函数的 key 参数:

nsort = lambda v:tuple(map(int, v.split('.')))
sorted(repo.tags, key=nsort)
于 2018-06-08T16:00:57.180 回答