Что не так со всеми предложениями (кроме Мэттью Бретт объяснение, до даты публикации этого ответа)?
Просто запустите любую команду, предоставленную другим, в истории jQuery Git, когда вы находитесь в другой точке истории и проверьте результат с помощью визуального представления истории тегов (I did вот почему вы видите этот пост):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
Сегодня многие проекты выполняют релизы (и т. Д.) в отдельной ветке от основной линии .
Для этого есть веская причина . Просто посмотрите на любые хорошо зарекомендовавшие себя проекты JS / CSS. Для пользовательских соглашений они несут двоичные / минимизированные файлы выпуска в DVCS. Естественно, как сопровождающий проекта вы не хотите очищать свою основную историю diff от бесполезных двоичных двоичных объектов и выполнять фиксацию артефактов сборки из основной линии .
Поскольку Git использует DAG, а не линейную историю - трудно определить метрику расстояния , поэтому мы можем сказать - о, эта скорость наиболее близка к моей HEAD
!
Я начинаю свое собственное путешествие (загляните внутрь, я не скопировал причудливые пробные изображения в этот длинный пост):
Какой ближайший тег в прошлом относился к ветвлению в Git?
В настоящее время у меня есть 4 разумных определения расстояния между тегом и ревизией с уменьшением полезности:
- длина кратчайшего пути от
HEAD
до объединение базы с тегом
- дата из объединить базу между
HEAD
и тегом
- количество оборотов , которые достижимы из HEAD, но недоступны из тега
- дата тега независимо база слияния
Я не знаю, как рассчитать длину кратчайшего пути .
Скрипт, который сортирует теги по дате из базы слияния между HEAD
и тегом:
$ git tag \
| while read t; do \
b=`git merge-base HEAD $t`; \
echo `git log -n 1 $b --format=%ai` $t; \
done | sort
Используется в большинстве проектов.
Скрипт, который сортирует теги в соответствии с числом оборотов , которые доступны из HEAD, но недоступны из тега:
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
Если в истории вашего проекта есть странные даты коммитов (из-за перебазировок или другой перезаписи истории, или какой-то придурок забыл заменить батарею BIOS или другую магию, которую вы делаете в истории), используйте сценарий выше.
Для последнего варианта ( дата тега независимо объединить базу ) для получения списка тегов, отсортированных по дате, используйте:
$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r
Чтобы узнать текущую дату ревизии, используйте:
$ git log --max-count=1
Обратите внимание, что git describe --tags
используется в своих собственных случаях, но не для поиска ожидаемого человеком ближайшего тега в истории проекта .
ПРИМЕЧАНИЕ Вы можете использовать вышеуказанные рецепты в любой ревизии, просто замените HEAD
на то, что вы хотите!