Який найпростіший спосіб отримати найсвіжіший тег у Git?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
вихід:
a
b
c
Чи слід писати сценарій, щоб отримати дату часу кожного тегу та порівняти їх?
Який найпростіший спосіб отримати найсвіжіший тег у Git?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
вихід:
a
b
c
Чи слід писати сценарій, щоб отримати дату часу кожного тегу та порівняти їх?
Відповіді:
Ви можете поглянути git describe
, що робить щось наближене до того, що ви просите.
--abbrev=0
він повинен повернути найближчий анотований тег
git describe --exact-match --abbrev=0
.
git describe --tags
і порівняйте останній тег com на сторінці випуску github
Щоб отримати найновіший тег:
git describe --tags
Щоб отримати останній помічений тег:
git describe --abbrev=0
git describe
говорить сторінка для чоловіка : --abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
Виведе тег останнього тегу комітів у всіх гілках
git describe --tags $(git rev-list --tags --max-count=1)
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-pursell
Щоб отримати найновіший тег, ви можете:
$ git для кожного ref refs / tags --sort = -taggerdate --format = '% (перейменування)' - рахунок = 1
Звичайно, ви можете змінити аргумент підрахунку або поле сортування за бажанням. Здається, ви, можливо, мали намір задати дещо інше запитання, але це відповідає на питання, коли я його тлумачу.
--sort=-authordate
і для --sort=authordate
.
--sort=-taggerdate
. Для тегів, authordate
і committerdate
порожні (так марні в якості ключів сортування).
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
ще краще :)
--points-at=$SHA
дасть вам тег для хеш-файлів.
Як щодо цього?
TAG=$(git describe $(git rev-list --tags --max-count=1))
Технічно не обов'язково ви отримаєте останню тег, але останню комісію, яка позначена тегами, яка може бути, а може і не бути предметом, який ви шукаєте.
--tags=<pattern>
в rev-list
. Наприклад, отримати тег останньої версіїgit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
Ви можете виконати: git describe --tags $(git rev-list --tags --max-count=1)
говорили тут: Як отримати останню назву тегу?
git describe ...
повертає попередній тег ?!)
--abbrev=0
відповіді, і вони відрізали частину тегу, який я хочу.
"Найновіший" може мати два значення з точки зору git.
Ви можете сказати, "який тег має дату створення найсвіжіший у часі", і більшість відповідей тут на це питання. З точки зору вашого питання, ви хочете повернути тег c
.
Або ви могли б означати «який тег є найближчою в історії розвитку в який - то по імені філії», як правило , в галузі ви знаходитеся, HEAD
. У вашому питанні це поверне тег a
.
Звичайно, вони можуть бути різними:
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
Уявіть, що розробник позначає тег Z
як v0.2
у понеділок, а потім тег, Q
як v0.1
у вівторок. v0.1
є більш новітньою, але v0.2
ближчою в історії розвитку до HEAD, в тому сенсі, що шлях, по якому він йде, починається в точці, ближчій до HEAD.
Я думаю, що ти зазвичай хочеш цієї другої відповіді, ближче до історії розвитку. Ви можете дізнатися це, використовуючи git log v0.2..HEAD
etc для кожного тегу. Це дає вам кількість комісій на HEAD з моменту закінчення шляхуv0.2
відхиленому від шляху, за яким йде HEAD.
Ось сценарій Python, який робить це шляхом повторення всіх тегів, на яких виконується ця перевірка, а потім роздруковування тегу з найменшими комісіями на HEAD, оскільки шлях тегу розходився:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
робить щось трохи інше, тим, що він відслідковує назад від (наприклад) HEAD, щоб знайти перший тег, який знаходиться на шляху назад в історії від HEAD. У git термінах git describe
шукає теги, які можна "дістати" від HEAD. Тому вони не знайдуть таких тегів, v0.2
які знаходяться не на шляху назад від HEAD, а в шляху, який розходився звідти.
git describe --tags
повертає останній тег, який зможе побачити поточна гілка
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed 's ...... '
ЯКЩО ВИ ПОТРІБНЕ БІЛЬШЕ, ЩО ОСТАНО ТАГ
(git описую - теги іноді дає неправильні хеші, я не знаю чому, але для мене - max-count 2 не працює)
ось як ви можете отримати список із останніми 2 іменами тегів у зворотному хронологічному порядку, відмінно працює на git 1.8.4. Для більш ранніх версій git (на зразок 1.7. *) У виводі немає рядка "tag:" - просто видаліть останній дзвінок sed
Якщо ви хочете більше двох останніх тегів - замініть цей "sed 2q" на "sed 5q" або все, що вам потрібно
Тоді ви можете легко проаналізувати кожне ім’я тегу до змінної чи так.
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
де %D
виключає навколишні ()
символи, а sed
s, починаючи з 5q, залишає 4 рядки до 5, після чого виводить усі символи між 'тегом: `і першим', '. Отже ... припускаючи, що всередині тегу не використовуються коми, це працює чудово.
Що не так у всіх пропозиціях (окрім пояснення Метью Бретта , оновленого цього відповіді)?
Просто запустіть будь-яку команду, надану іншими в історії jQuery Git, коли ви знаходитесь в іншому пункті історії, і перевірте результат за допомогою візуального представлення історії тегів (я це зробив , тому ви бачите цю публікацію):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
Сьогодні багато проектів виконують релізи (і так маркують їх) в окремій галузі від основної лінії .
Для цього є вагомі причини . Подивіться на будь-які налагоджені проекти JS / CSS. Для конвенцій користувачів вони містять файли двійкових / мінімізованих релізів у DVCS. Звичайно, як керівник проекту, ви не хочете сміття своєї історії основного розряду непотрібними бінарними краплями і виконувати фіксацію складання артефактів поза межі лінії .
Оскільки Git використовує DAG, а не лінійну історію - важко визначити метрику відстані, тому можна сказати - о, що обороти найбільш близькі до мого HEAD
!
Я починаю свою власну подорож (загляньте всередину, я не копіював химерні доказові зображення на цю довгу посаду):
Що є найближчим тегом у минулому щодо розгалуження в Git?
В даний час у мене є 4 розумні визначення відстані між тегом та версією зі зменшенням корисності:
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
тим, що хочете!
git tag -l ac* | tail -n1
Отримайте останній тег із префіксом "ac" . Наприклад, тег з ім'ям ac1.0.0
, або ac1.0.5
. Інші теги, названі 1.0.0
, 1.1.0
будуть ігноровані.
git tag -l [0-9].* | tail -n1
Отримайте останній тег, першим символом якого є 0-9
. Отже, ці теги з першим символом a-z
будуть ігноровані.
git tag --help # Help for `git tag`
git tag -l <pattern>
Перерахуйте теги з іменами, які відповідають заданому шаблону (або всі, якщо шаблон не вказаний). Запуск "git tag" без аргументів також містить список усіх тегів. Візерунок являє собою підстановку оболонки (тобто, зіставлену за допомогою fnmatch (3)). Можна надати кілька моделей; якщо будь-який з них відповідає, тег відображається.
tail -n <number> # display the last part of a file
tail -n1 # Display the last item
З git tag --help
, про sort
аргумент. Він використовуватиметься lexicorgraphic order
за замовчуванням, якщо tag.sort
властивості не існує.
Сортуйте параметри за замовчуванням до значення, налаштованого для змінної tag.sort, якщо вона існує, або лексикографічного порядку в іншому випадку. Див. Git-config (1).
Після google хтось сказав, що git 2.8.0 підтримує наступний синтаксис.
git tag --sort=committerdate
git tag --sort=committerdate | tail -1
Наступні роботи для мене працюють у випадку, якщо вам потрібні два останні теги (наприклад, для створення журналу змін між поточним тегом і попереднім тегом). Я перевіряв його лише в ситуації, коли останній тег був HEAD
.
PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`
GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`
Це відповідає моїм потребам, але оскільки я не є майстром з git, я впевнений, що це може бути вдосконалено. Я також підозрюю, що він порушиться у випадку, якщо історія фіксації рухається вперед. Я просто ділюсь на випадок, якщо це комусь допоможе.
Моя перша думка - це ти можеш використовувати git rev-list HEAD
, де перераховуються всі обороти у зворотному хронологічному порядку в поєднанні з git tag --contains
. Коли ви знайдете реферат, де git tag --contains
створюється непорожній список, ви знайшли останні теги.
Якщо вам потрібен один вкладиш, який отримує останню назву тегу (за датою тегу) на поточній гілці :
git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
Ми використовуємо це для встановлення номера версії в налаштуваннях.
Приклад виводу:
v1.0.0
Працює і в Windows.
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
) і пропускаю її, --points-at=HEAD
вона працює. З цим останнім комутатором він нічого не повертає, я думаю, тому що мій HEAD
не позначений
HEAD
не позначений.
Це стара нитка, але, здається, багато людей пропускають найпростішу, найпростішу та найправильнішу відповідь на питання ОП: щоб отримати останню тег для поточної гілки , ви використовуєте git describe HEAD
. Зроблено.
Редагувати: ви також можете надати будь-яке дійсне ім'я, навіть віддалене; тобто git describe origin/master
розповість вам останній тег, до якого можна дістатись від origin / master.
for-each-ref
команда ( stackoverflow.com/a/5261470/515973 ) і поєднання , rev-list
і describe
( stackoverflow.com/a/7979255/515973 )
git describe branchname --tags
працює для мене, щоб отримати останню тег у відділенні (git версія 2.12.2)
Щоб отримати останній тег лише на поточній імені гілки / тегу, що префіксує поточну гілку, мені довелося виконати наступне
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH
Майстер відділення:
git checkout master
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
master-1448
Спеціальна галузь:
git checkout 9.4
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
9.4-6
І моя остаточна потреба збільшити та отримати тег +1 для наступного тегування.
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
Що стосується питання,
Як отримати останню назву тегу в поточній гілці
ти хочеш
git log --first-parent --pretty=%d | grep -m1 tag:
--first-parent
говорить git log
не деталізувати об'єднані історії, --pretty=%d
каже показувати лише прикраси, тобто місцеві назви для будь-яких комітетів. grep -m1
каже "відповідь лише одному", тож ви отримуєте лише найновіший тег.
Тут не так вже й багато згадок про не помічені теги проти анотованих. "Опис" працює над поміченими тегами та ігнорує ненаголошені.
Це некрасиво, але запитується завдання, і воно не знайде тегів на інших гілках (а не на тій, що вказана в команді: master у прикладі нижче)
Проблема фільтрації повинна бути оптимізована (консолідована), але знову ж таки, це здається завданням.
git log --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1
Критика вітається, тому що я зараз збираюся використовувати це для використання :)