Учитывая имя 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
}
На данный момент это работает хорошо, хотя это было очень легко проверено.
Ответы
Ответ 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}
все существуют - этот синтаксис более удобен/естественен в некоторых случаях