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)