GitPython 标签排序

25 投票
4 回答
21737 浏览
提问于 2025-04-18 15:28

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

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 这个命令,也知道如何在不使用仓库对象的情况下解决这个问题。但也许有人知道我在这个库中获取排序标签列表时缺少了什么)

自定义排序函数也是一个选择,但我还是想知道有没有办法用GitPython来实现这个功能?

4 个回答

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)
6

上面的做法在标签有不同的提交记录时是有效的(这通常是这样的)。不过,有一种更准确的方法可以使用,它会获取标签的日期,具体做法如下:

import git
repo = git.Repo('path/to/repo')
tags = sorted(repo.tags, key=lambda t: t.tag.tagged_date)
latest_tag = tags[-1]
32

在GitPython中,repo.tags返回的IterableList对象是基于Python的list类的,这意味着你可以按照自己的方式对它进行排序。如果你想获取最新创建的标签,只需这样做:

import git
repo = git.Repo('path/to/repo')
tags = sorted(repo.tags, key=lambda t: t.commit.committed_datetime)
latest_tag = tags[-1]
5

我刚刚查看了一下,发现了负责排序的代码。所以我觉得唯一的办法就是自己反转排序的顺序,比如:

reversed(repo.tags)

如果你愿意的话,也可以使用底层的 git 命令,然后自己解析结果,比如这个例子:

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

这样的话,任何git tag能做的事情,你都能做到(这对于按顺序列出标签,从某个特定的提交开始,可能会很有意思)。

撰写回答