Подтвердить что ты не робот

Учитывая имя git refname, могу ли я определить, является ли он хешем, тегом или ветвью?

Я пишу script, который будет использовать спецификацию, используемую в качестве базы для создания ветки. Таким образом, у него будет что-то вроде этого:

git checkout -b $newbranch $startingpoint

Теперь startingpoint можно указать либо как имя ветки, тэг, либо SHA1.

Позже в script мне нужно делать разные вещи, основываясь на том, что на самом деле startingpoint. Я думал, что git rev-parse предоставит мне эту информацию, но я не могу склонить ее к своей прихоти.

Есть ли способ git, предпочтительно фарфор, чтобы получить информацию, которую я ищу?

Обновление

Я использовал информацию show-ref для создания следующей функции оболочки:

git_ref_type() {
    [ -n "$1" ] || die "Missing ref name"

    if git show-ref -q --verify "refs/heads/$1" 2>/dev/null; then
        echo "branch"
    elif git show-ref -q --verify "refs/tags/$1" 2>/dev/null; then
        echo "tag"
    elif git show-ref -q --verify "refs/remote/$1" 2>/dev/null; then
        echo "remote"
    elif git rev-parse --verify "$1^{commit}" >/dev/null 2>&1; then
        echo "hash"
    else
        echo "unknown"
    fi
    return 0
}

На данный момент это работает хорошо, хотя это было очень легко проверено.

4b9b3361

Ответ 1

Возможно, вы можете использовать команду show-ref для выполнения (в основном) того, что вы хотите. Учитывая некоторую строку, если она ссылается на тег, тогда...

git show-ref --verify refs/tags/$thestring

... будет истинным. Если это имя ветки, то...

git show-ref --verify refs/heads/$thestring

... будет истинным. Если строка не проходит оба этих теста, тогда...

git rev-parse --verify "$thestring^{commit}"

... скажет вам, ссылается ли он иначе на коммит (который может быть полным SHA1, частичным SHA1, HEAD или, возможно, чем-то другим, который не попадает в предыдущие две категории.

Ответ 2

Обратите внимание, что git 1.8.5 или 1.9 (Q4 2013) предоставит новый способ проверить, является ли ссылка тегом или нет.

Сделайте "foo^{tag}", чтобы очистить тег до себя, т.е. нет-op., и сбой, если "foo" не является тегом.

Как проверить revision - это тег? (или "проверить, является ли git имя тегом"?)

git rev-parse --verify v1.0^{tag}

Более удобно, чем: test $(git cat-file -t v1.0) = tag ".

См. Commits 75aa26d и abdb54a1d, Ричард Хансен:

peel_onion(): добавить поддержку <rev>^{tag}

Заполните описание дескрипторов объектов <rev>^{<type>} с помощью <rev>^{tag} разыменования <rev> до тех пор, пока объект тега не будет найден (или не сработает, если не сможет).

На первый взгляд это может показаться не очень полезным, поскольку коммиты, деревья и капли не могут быть очищены от тега, а тег просто очистится от него. Однако это можно использовать для обеспечения того, чтобы <rev> называл объект тега:

$ git rev-parse --verify v1.8.4^{tag}
04f013d
$ git rev-parse --verify master^{tag}
error: master^{tag}: expected tag type, but the object dereferences to tree type
fatal: Needed a single revision

Пользователи уже могут гарантировать, что <rev> является объектом тега, проверяя вывод "git cat-file -t <rev>", но:

  • пользователи могут ожидать, что <rev>^{tag} будет существовать при условии, что <rev>^{commit}, <rev>^{tree} и <rev>^{blob} все существуют
  • этот синтаксис более удобен/естественен в некоторых случаях