GitPython标签已排序

Ili*_*tko 9 python tags git sorting gitpython

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

repo = Repo(project_root)
last_tag = str(repo.tags[-1])
Run Code Online (Sandbox Code Playgroud)

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

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

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

rob*_*aos 14

GitPython IterableList返回的对象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]
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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


Byr*_*ron 5

我刚刚看了一下,发现了负责排序的代码。因此,我别无选择,只能自己反转排序顺序,例如

reversed(repo.tags)
Run Code Online (Sandbox Code Playgroud)

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

repo.git.tag(l=True) # equals git tag -l
Run Code Online (Sandbox Code Playgroud)

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

  • 链接已损坏。 (3认同)
  • 这个答案实际上并不正确 - 它假设标签的排序是按照创建的顺序进行的,但事实并非如此。它是按字母顺序排序的。`git tag --sort Creatordate` OTOH 将按标签创建日期排序 (2认同)
  • @hewsonism 这实际上正是答案。Git 标志是通过 kwargs 从 Python 传递的,因此 `repo.git.tag(sort='creatordate').split('\n')` (带有格式更改)返回按创建日期升序排序的标签列表。 (2认同)