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

Shell script - попытка проверить, существует ли тег git в репозитории git в операторе if/else

Я создаю развертывание script для приложения zend. Сценарий почти завершен только, я хочу проверить, существует ли в репозитории тег, чтобы заставить теги в команде. В настоящее время у меня есть следующий код:

# Fist update the repo to make sure all the tags are in
cd /git/repo/path
git pull

# Check if the tag exists in the rev-list. 
# If it exists output should be zero, 
# else an error will be shown which will go to the else statement.
if [ -z "'cd /git/repo/path && git rev-list $1..'" ]; then

    echo "gogo"

else

    echo "No or no correct GIT tag found"    
    exit

fi

С нетерпением ждем ваших отзывов!

Update

Когда я выполняю в командной строке следующее:

cd /git/repo/path && git rev-list v1.4..

Я получаю NO вывод, что хорошо. Хотя при выполнении:

cd /git/repo/path && git rev-list **BLA**..

Я получаю ошибку, что снова хорошо:

fatal: ambiguous argument 'BLA..': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

В заявлении -z говорится, что если sting пуст, то... Другими словами, он отлично работает через командную строку. Хотя, когда я использую ту же команду в оболочке script внутри инструкции, она не работает.

[ -z "'cd /git/repo/path && git rev-list $1..'" ]

Этот метод, вдохновленный Подтвердить, существует ли фиксация

Обновление 2

Я нашел проблему:

См. Использование if elif fi в сценариях оболочки >

sh интерпретирует && как оператор оболочки. Измените его на -a, thats Оператор слияния:

[ "$ arg1" = "$ arg2" -a "$ arg1" != "$ arg3" ] Кроме того, вы всегда должны цитируйте переменные, потому что [запутывается, когда вы опускаетесь Аргументы.

Другими словами, я изменил значение && на ; и упростил условие. Теперь он работает красиво.

if cd /path/to/repo ; git rev-list $1.. >/dev/null

then

    echo "gogo"

else
    echo "WRONG"
    exit
fi
4b9b3361

Ответ 1

Вместо git rev-parse можно использовать

if GIT_DIR=/path/to/repo/.git git rev-parse $1 >/dev/null 2>&1
then
    echo "Found tag"
else
    echo "Tag not found"
fi

git rev-list вызывает графическую ходьбу, где git rev-parse избегает ее. Вышеизложенное имеет некоторые проблемы с возможностью поиска объекта вместо тега. Вы можете избежать этого, используя ^{tag}, следуя имени тега, но это работает только для аннотированных тегов, а не для облегченных тегов:

if GIT_DIR=/path/to/repo/.git git rev-parse "$1^{tag}" >/dev/null 2>&1
then
    echo "Found tag"
else
    echo "Tag not found"
fi

@Lassi также указывает, что если имя вашего тега начинается с -, тогда вместо него он может быть интерпретирован как опция. Вы можете избежать этой проблемы, ища refs/tags/$1. Таким образом, в целом, с версией rev-parse вы можете искать refs/tags/$1 для получения как легких, так и аннотированных тегов, и вы можете добавить ^{tag} в конец для принудительного применения аннотированного тега (refs/tags/$1^{tag}).

Кроме того, как уже упоминалось ранее @forvaidya, вы можете просто перечислить теги и grep для тех, которые вы хотите:

if GIT_DIR=/path/to/repo/.git git show-ref --tags | egrep -q "refs/tags/$1$"
then
    echo "Found tag"
else
    echo "Tag not found"
fi

Вы также можете использовать git tag --list вместо git show-ref --tags:

if GIT_DIR=/path/to/repo/.git git tag --list | egrep -q "^$1$"
then
    echo "Found tag"
else
    echo "Tag not found"
fi

Если вы знаете тег, я думаю, что лучше всего просто просмотреть его через rev-parse. Одна вещь, которая мне не нравится в версии egrep, состоит в том, что возможно, что у вас могут быть символы, которые могут интерпретироваться как регулярные выражения и вызывать ложный или ложный отрицательный результат. Версия rev-parse является превосходной в этом смысле и в ней не рассматривается весь список тегов.

Ответ 2

Здесь версия rev-parse развивается следующим образом:

tag=whatever
if git rev-parse -q --verify "refs/tags/$tag" >/dev/null; then
    echo "found"
else
    echo "not found"
fi

Он кажется надежным:

  • Проверяет только тег, а не ветку или хеш-код фиксации и т.д.
  • Ввод имени нечеткого имени тега не вызывает странного поведения:
    • Имена тегов, начинающиеся с "-", не ошибаются для параметров командной строки.
    • Названия тегов, содержащие косые черты или точки, не являются специальными
    • Названия тегов, содержащие пробелы, не являются специальными
    • Пустое имя тега не является особенным

Ответ 3

Это еще более простая версия решения cad106uks:

version=1.2.3

if [ $(git tag -l "$version") ]; then
    echo yes
else
    echo no
fi

Нет необходимости сравнивать вывод git tag -l с номером версии, потому что вывод будет пустым, если версия не найдена. Поэтому его достаточно, чтобы проверить, нет ли вообще никакого вывода.

Примечание. Цифры вокруг $version важны, чтобы избежать ложных срабатываний. Потому что, если $version по какой-то причине пуст, git tag -l будет просто перечислять все теги, и условие всегда будет истинным.

Ответ 4

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

# Filename: check-for-tag
# Usage:    check-for-tag <TAG_NAME>
# Example:  check-for-tag ticket-123-fix-this-bug
TAG_NAME=$1
git ls-remote --tags 2>/dev/null | grep $TAG_NAME 1>/dev/null
if [ "$?" == 0 ]; then 
   echo "Git tag $TAG_NAME exists."
else  
   echo "Git tag $TAG_NAME does not exist."
fi

Ответ 5

Мне очень нравится решение, которое, я думаю, использует более современную версию git (git версия 2.7.4)

#!/usr/bin/env bash
cd /to/repo/base;
tagName="Whatever";

if [[ `git tag -l $tagName` == $tagName ]]; then
    echo "yes";
else
    echo "no";
fi