2013-05-30 3 views
2

В скрипте я хотел бы определить, был ли отмечен тег или ветка.Определите, была ли отмечена ветка или тег с git

На данный момент, у меня есть:

git describe --tags 

Он будет показывать имя тега, но если мы на ветке, это вызовет ошибку (с возвращаемым = 0!):

fatal: No names found, cannot describe anything. 

Могу ли я полагаться на это поведение или есть лучший/более официальный способ сделать это?

Есть ли некоторые случаи, которые не были пойманы этим методом, который я должен знать?

+0

Я нахожусь на ветке, и 'git describe --tags' не вызывает никаких ошибок. Он просто показывает первый доступный тег, из которого вы находитесь – iberbeu

+0

@iberbeu. Да, я заметил, что 'git describe -tags' не подходит для этого, см. Мой собственный ответ ^^ –

ответ

4

Вы можете использовать git symbolic-ref HEAD, чтобы проверить, если вы находитесь на ветке и получила свое название:

> git checkout master 
[....] 
> git symbolic-ref HEAD 
refs/heads/master 
> echo $? 
0 

Если вы проверили тег, вы получите ошибку:

> git checkout some_tag 
[....] 
> git symbolic-ref HEAD 
fatal: ref HEAD is not a symbolic ref 
> echo $? 
128 
0

git status (или git branch) знать, на какой ветке вы находитесь. Примечание: вы всегда находитесь на ветке: ветвь по умолчанию - master.

Используйте git tag, чтобы узнать список тегов на текущей ветке.

+0

Когда я нахожусь на теге,' git branch' покажет, что я на '* (без ветвления)', поэтому я думаю, что я не всегда на ветке? Также 'git tag' не очень полезно знать на *, который * тег я (т. Е. Какой тег я проверил). –

+0

(я ответил, разместив еще один ответ) – Claudio

0

Ну после некоторого тестирования вокруг получается git describe --tags не очень надежно (в одном случае я проверил ветку, что-то возвращал).

Я закончил с использованием:

git branch | grep '^*' 

Это возвращает выбранную ветвь. В случае, если я проверил тег, это вернет:

* (no branch) 

В моем сценарии я разобрать строку, чтобы проверить, если он содержит (no branch).

+0

, а что, если вы на ветке и на теге за раз? В этом случае git сообщает вам, что вы не на ветке, в то время как вы на самом деле – iberbeu

1

(редактировать) лучше, чем то, что у меня было раньше:

if read what where huh; test "$what" = ref: 
then echo On branch ${where#refs/heads/} 
else echo "not on any branch; last checkout was:" 
    git reflog|sed '/checkout:/!d;q' 
fi < "`git rev-parse --git-dir`"/HEAD 

сообщит вам, откуда пришел ваш последний заказ.

git log HEAD^! --oneline --decorate 

сообщит вам все символические имена для текущей фиксации.

Смежные вопросы