Ответ 1
После перехода на Git docs мне удалось написать:
$ git tag \
| while read t; do \
b=`git merge-base HEAD $t`; \
echo `git log -n 1 $b --format=%ai` $t; \
done | sort
...
2014-04-18 17:17:51 -0400 2.1.1-rc2
2014-04-30 10:43:39 -0400 2.1.1
2014-05-18 20:47:37 +0400 2.1.2
2014-05-18 20:47:37 +0400 2.1.3
2014-05-18 20:47:37 +0400 2.1.4
2015-07-13 15:01:33 -0400 3.0.0-alpha1
Как я уверен, Hg сделал соответствующее решение:
$ hg convert \
$(git -C jquery/ rev-parse --branches --remotes --tags \
| sed 's=.*=--rev &=') \
jquery/ jquery-hg/
$ cd jquery-hg
$ hg up -r master
$ hg log -r 'tag()' --template '{node} {tags}\n' \
| while read r t; do \
hg log -r "ancestor($r,.)" --template "{date|isodate} {node} $t \n"; \
done | sort
2014-06-16 03:08 +0400 f6f4d6eb708a33f714a2e0003cb7087762407348 2.1.2
2014-06-16 03:08 +0400 f6f4d6eb708a33f714a2e0003cb7087762407348 2.1.3
2014-06-16 03:08 +0400 f6f4d6eb708a33f714a2e0003cb7087762407348 2.1.4
2015-07-13 15:01 -0400 4abe7e961f0e5eb0e75f03030a80a128553f34c1 3.0.0-alpha1
Я могу добавить псевдоним к ~/.bashrc
, и этот код занимает около 4 секунд в источниках jQuery/Hibernate/Lunix/Spring, но некоторые странные заполнения не оставляют меня. Есть ли однолинейное решение?
ОБНОВЛЕНИЕ Я написал длинный ответ в fooobar.com/info/4969/... Вот важные части:
Поскольку Git использует DAG, а не линейную историю - трудно определить метрику расстояния, поэтому мы можем сказать - о, что rev наиболее близок к моему HEAD
!
Некоторое разумное определение расстояния между тегом и ревизией:
- длина кратчайшего пути из
HEAD
, чтобы объединить базу с тегом (не знаю, кому вычислить командуgit
) - date базы слияния между
HEAD
и тегом (см. выше script) - количество оборотов, доступное из HEAD, но недоступное из тега (см. ниже script)
Script, которые сортируют теги в соответствии с числом оборотов, доступным из HEAD, но недоступным из тега:
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
Если в истории вашего проекта есть странные даты на фиксации (из-за пересогласования или другой перезаписи истории или какого-нибудь придурка забыть заменить батарею BIOS или другие магии, которые вы делаете в истории) используйте script.