Як я можу перерахувати всі теги у моєму сховищі Git за датою їх створення?


128

Мені потрібен спосіб перерахувати всі теги в моїй системі за датою їх створення, але я не впевнений, чи зможу я отримати ці дані за допомогою git-log. Ідеї?


2
Ви маєте на увазі, що хочете отримати список усіх тегів у порядку дат створення?
lithuak

3
FYI (1.) Це питання стосується перерахування АНОТОВАНИХ тегів за датою. (2.) Щоб перерахувати теги LIGHTWEIGHT за датою, перейдіть сюди . (3.) Щоб отримати корисне нагадування про те, яка різниця між легкою вагою Git від помічених тегів, перейдіть сюди .
Тревор Бойд Сміт

@TrevorBoydSmith: Це не зовсім правильно. Різниця полягає в тому, що (2) перераховано всі тег по фіксації дати з помічених фіксації , в той час як ця сторінка дає рішення, сортувати по даті маркованого (хоча тільки для анотованих тегів, так як мерзотник не дата магазину позначена для легких тегів).
Девід П

Відповіді:


174

Сортування за датою створення тегів працює з поміченими та легкими тегами:

git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags

12
Дивовижно. git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagsробив саме те, що мені потрібно. Дякую!
Джон Урсенбах

21
Рішення по @DrorCohen , який працює для легких тегів: stackoverflow.com/questions/6900328 / ... . Вставте тут для легкої довідки: git журнал - теги - спрощення за оформленням --pretty = "формат:% ai% d"
Gilead

5
Можна використовувати %(contents)для додавання в примітці за потреби, наприкладgit for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Тім Діггінс

7
Або навіть трохи чистіше:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers

4
--sort=creatordateпрацює як з поміченими, так і без поміченими тегами, але, --sort=taggerdateздається, працює лише з поміченими тегами. перевірено з використаннямgit version 2.16.3
австінхайм

56

Git 2.8 (березень 2016 року) документує ще один варіант, що починається з git 1.4.4 (жовтень 2006 р . ) .
Див. Комісію e914ef0 (05 січня 2016) Еріка Вонга ( ele828) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 108cb77 , 20 січня 2016 р.)

Дивіться нове Documentation/git-for-each-ref.txt

Для об'єктів фіксування та тегування, спеціальні creatordateта creator поля відповідатимуть відповідній даті або кордону дати-імені-дати від полів committerабо taggerзалежно від типу об'єкта.
Вони призначені для роботи над поєднанням помічених та полегшених тегів .

Тож використання creatordateтворів з тегами:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }' 

Або:

git tag --sort=-creatordate 

Оскільки я детально описую в " Як сортувати теги git за порядковим рядком версії форми rc-XYZW? ", Ви можете додати порядок сортування до git tag(з Git 2.0 червня 2014 року).

Такий порядок сортування включає в себе назву поля ( git for-each-ref вказану в ) taggerdate . Це дозволяє git tag --sort=taggerdate(згадано DarVar нижче )
Як приклад, у git/gitрепо рейтингу він буде перелічений v2.10.0останнім тегом:

v2.9.1
v2.9.2
v2.9.3
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.10.0

Замовлення за замовчуванням не буде ( git tag):

v2.1.2
v2.1.3
v2.1.4
v2.10.0
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.2.0

Дуже дякую. Мені було цікаво, чому деякі дати порожні. Я вже підозрював легкі бирки. Я радий, що мені не потрібно відтворювати теги завдяки creatordate!
ексгума

35
git log --tags --simplify-by-decoration --pretty="format:%ci %d"

Також хороший вихід із (без поля дати):

git log --tags --decorate --simplify-by-decoration --oneline

Щоб переглянути повну історію із залежностями та смугастими лінійними комітами (лише суттєві події, такі як теги та розгалуження / злиття):

git log --graph --decorate --simplify-by-decoration --oneline --all

Для ледачих людей: git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"і це найкраще працює для мене.
Матеуш

1
Зауважте, що це впорядковується за датою здійснення, а не за датою створення тегів. Відповідь (на даний момент) з найкращим рейтингом Джош Лі робить замовлення на дату створення тегу.
Nathanial Woolls

13
git tag --sort=-taggerdate

Відповідно до сторінки man, "Префікс - сортувати в порядку зменшення значення".

git tagвикористовує ті самі ключі сортування git-for-each-ref, що і там, де ключі документуються.


1
Це, мабуть, найправильніше на основі запитань. Ось посилання на документи, які окреслюють можливі поля сортування: git-scm.com/docs/git-for-each-ref
prasanthv

Ця відповідь не враховує полегшених тегів, оскільки у них порожній "taggerdate". Інші відповіді з "creatordate" є більш точними.
morhook

13

Цей однострочний параметр відображає дати та позначки без суєти.

git tag --format='%(creatordate:short)%09%(refname:strip=2)'

Вихід:

2015-04-01  storaged-2.0.0
2015-06-11  storaged-2.1.0
2015-08-06  storaged-2.1.1
...

Якщо вам не подобається, як теги сортуються за замовчуванням, ви можете сортувати за датою --sort=creatordate, наприклад, наприклад. Дивіться відповідь VonC .


Чи зобов'язаний цей приємний метод сортувати їх за датою? висхідний? низхідний?
Motti Shneor

11

Щоб анотовані теги та полегшені теги були впорядковані на основі дати здійснення, я використовую:

git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
  sort -n | awk '{ print $4, $3; }' 

Ця команда буде перелічувати кожен тег та пов'язаний з ним ідентифікатор об’єкта фіксації в хронологічному порядку.


Трохи затуманився. ... У анотованих тегах 'committerdate' порожній, тоді як у полегшених тегах 'taggerdate' порожній. Отож, як вирішення проблеми "* committerdate" повідомляє Git, щоб дати відновлення від початкового об'єкта фіксації, коли він легкий. ...
ingyhere

Використання "creatordate" замість цього має ефективно робити те саме.
ingyhere


5

Далі покладається на зобов’язання, тому не має значення, чи є у нього інформація про дату з комітетом:

git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac

Відповідь, вказана вище Джошем Лі, покладається на дату тегу, щоб виправити замовлення.


Не впевнений, що таке трейлінг команда tac- може змінити її на more. У будь-якому випадку ваша команда спрацювала чудово - дякую!
Девід Н


3

Спираючись на раніше згадані методи, я хотів також побачити фактичну дату тегів у списку, і тому моя версія, що використовується, така:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.