GitPython 标签排序
我正在尝试使用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 个回答
排序是按照字母和数字的顺序进行的,所以“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)
上面的做法在标签有不同的提交记录时是有效的(这通常是这样的)。不过,有一种更准确的方法可以使用,它会获取标签的日期,具体做法如下:
import git
repo = git.Repo('path/to/repo')
tags = sorted(repo.tags, key=lambda t: t.tag.tagged_date)
latest_tag = tags[-1]
在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]
我刚刚查看了一下,发现了负责排序的代码。所以我觉得唯一的办法就是自己反转排序的顺序,比如:
reversed(repo.tags)
如果你愿意的话,也可以使用底层的 git 命令,然后自己解析结果,比如这个例子:
repo.git.tag(l=True) # equals git tag -l
这样的话,任何git tag
能做的事情,你都能做到(这对于按顺序列出标签,从某个特定的提交开始,可能会很有意思)。