Получить имя текущей ветки / тега git

Как я могу получить текущее имя ветки или тега для моей рабочей копии? Я видел ссылки, в которых указано, что rev-parse --abbrev-ref HEAD будет давать имя ветки, но это не работает, если проверка относится к тегу, и в этом случае он просто возвращает «HEAD». Мне нужно как-то получить название тега этих ревизий.

Для ясности, я хочу одно из двух возможных имен:

  1. Если текущая проверка является ГОЛОВКОЙ ветки, мне нужно имя ветки
  2. Если это отдельная ГОЛОВА, мне нужно имя тега (при условии, что тег есть)

person edA-qa mort-ora-y    schedule 06.09.2013    source источник
comment
возможный дубликат Получить тег git проверенной ревизии?   -  person Felix Kling    schedule 06.09.2013
comment
@FelixKling, проблема действительно в том, чтобы получить единый результат. Если вам случится проверить ветку с тегом, другой метод просто выдаст тег. Таким образом, вопрос включает в себя, как определить, действительно ли это отдельная ревизия HEAD / тега.   -  person edA-qa mort-ora-y    schedule 06.09.2013
comment
что насчет этого? stackoverflow.com/questions/1404796/   -  person smcg    schedule 06.09.2013


Ответы (3)


Я думаю, вы этого хотите:

git symbolic-ref -q --short HEAD || git describe --tags --exact-match

Это выведет значение HEAD, если оно не отсоединено, или выдаст имя тега, если оно точное совпадение. В противном случае он покажет вам ошибку.

person John Szakmeister    schedule 06.09.2013

Эта команда может печатать имя с таким приоритетом: tag> branch> commit

git describe --tags --exact-match 2> /dev/null \
  || git symbolic-ref -q --short HEAD \
  || git rev-parse --short HEAD
person Xiaohui Zhang    schedule 21.03.2019
comment
Если ветвь указывает на тег, и вы выполняете git checkout branch, эта команда вернет тег. Я думаю, что правильный порядок branch - ›tag, как в ответе от @John Szakmeister, который отлично работает в обоих случаях (проверка веток и тегов). - person thisismydesign; 26.11.2019

Эта команда может печатать имя с таким приоритетом: branchtagcommit id

git symbolic-ref --short -q HEAD \
  || git describe --tags --exact-match 2> /dev/null \
  || git rev-parse --short HEAD

Объединены ответ @ xiaohui-zhang и комментарий @ thisismydesign. Я возвращаюсь к этому вопросу каждые несколько месяцев, и в итоге получаю ответ, поэтому я решил опубликовать его.

person user187557    schedule 18.11.2020
comment
Я пытаюсь понять, при каких обстоятельствах это вернет имя тега. Я имею в виду, что не каждый тег просто тег в какой-то ветке (будь то главная или любая другая ветка). Эта команда git всегда будет первой возвращать ветку, так зачем ей вообще возвращать тег? - person Dewald Swanepoel; 19.11.2020
comment
Ветви относятся к коммитам, а теги - к коммитам. Если и ветвь, и тег ссылаются на текущий извлеченный коммит, то это вернет ветку. Если у текущего извлеченного коммита есть тег, но нет ветки, он вернет этот тег. Если текущая извлеченная фиксация не имеет ветки или тега, тогда будет возвращен идентификатор фиксации. - person user187557; 20.11.2020