GitPython теги отсортированы

Я пытаюсь получить последний тег в репозитории, используя GitPython lib. Обычно я делал это так:

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 ответа

Решение

Я только что посмотрел и нашел код, отвечающий за сортировку. Поэтому я не вижу другого выхода, кроме как изменить порядок сортировки самостоятельно, например,

reversed(repo.tags)

При желании вы также можете использовать базовую команду git и самостоятельно проанализировать результат, например, в этом примере:

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

Таким образом, что угодно git tag можно делать, можно делать (что может быть интересно для перечисления тегов в порядке обхода, начиная с данного коммита).

IterableList объект, возвращенный repo.tags в GitPython наследует от list класс Python, что означает, что вы можете сортировать его так, как вы хотите. Чтобы получить последний созданный тег, вы можете просто сделать:

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

Вышеописанное будет работать, если с тэгами связаны разные коммиты (как правило, так). Однако более точный способ будет заключаться в следующем, который выбирает дату тега:

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

Сортировка выполняется в алфавитно-цифровом порядке, поэтому "1,9" ранжируется выше, чем "1,10", потому что это порядок символов и "9"> "1".

Если вы хотите более разумную сортировку, у вас есть два варианта: заполнить нулями номера версий (1.09 вместо 1.9), что было бы предпочтительнее, но это трудно реализовать задним числом.

Другой сортирует теги в Python. Существует библиотека natsort, которая выполняет естественные сортировки для всех видов данных. Но для этого простого случая вы также можете использовать ключевой аргумент функции сортировки:

nsort = lambda v:tuple(map(int, v.split('.')))
sorted(repo.tags, key=nsort)
Другие вопросы по тегам