Kim Kim - 6 months ago 4x
Bash Question

Shell script - trying to validate if a git tag exists in a git repository in an if/else statement

I am creating a deploy script for a zend application. The scrip is almost done only I want to verify that a tag exists within the repo to force tags on the team. Currently I have the following code:

# 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"


echo "No or no correct GIT tag found"


Looking forward to your feedback!


When I execute the following in the command line:

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

I get NO output, which is good. Though when I execute:

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

I get an error, which again is good:

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

The -z in the statement says, if sting is empty then... In other words, it works fine via command line. Though when I use the same command in a shell script inside a statement it does not seem to work.

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

This method what inspired by Validate if commit exists

Update 2

I found the problem:

See using if elif fi in shell scripts >

sh is interpreting the && as a shell operator. Change it to -a, that’s
[’s conjunction operator:

[ "$arg1" = "$arg2" -a "$arg1" != "$arg3" ] Also, you should always
quote the variables, because [ gets confused when you leave off

in other words, I changed the
and simplified the condition. Now it works beautiful.

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


echo "gogo"

echo "WRONG"


You could use git rev-parse instead:

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

git rev-list invokes graph walking, where git rev-parse would avoid it. Also, as mentioned before by @forvaidya, you could simply list the tags and grep for the one you want:

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

If you know the tag though, I think it's best just to just look it up via rev-parse.