I'd like to know whether a remote repository exists. Here's what I came up with:
git ls-remote -h "$REPO_URL" &> /dev/null
Is there any better way?
I think the git ls-remote command is pretty much made for that purpose.
If you use --exit-code argument you can skip sending output to null. It will return something only in case of error.
Also, you can use -h argument to show only heads references.
git ls-remote --exit-code -h "$REPO_URL"
TL;DR:
git ls-remote is the way, here is a shell-ready function for quick access:
## Returns errlvl 0 if $1 is a reachable git remote url
git-remote-url-reachable() {
git ls-remote "$1" CHECK_GIT_REMOTE_URL_REACHABILITY >/dev/null 2>&1
}
Usage:
if git-remote-url-reachable "$url"; then
## code
fi
What is it doing ?
This is just a convenient mash-up of all the comments/solutions previously stated with some small tweaks, a bash copy-paste ready function and usage code sample to make it crystal clear. You'll note that:
it limits output as the reference checked (here CHECK_GIT_REMOTE_URL_REACHABILITY) is probably nonexistent on the remote server, and git doesn't have anything to answer back. We rely on the fact that git
will still exit with error-level 0 on non-existing ref. The only difference
here is that there are slightly less output to transfer on the network compared
to ask for HEAD (and much less than not asking for a ref or even limiting to
only heads), and this is also less output to cast in /dev/null (but this
last one is taking negligible time anyway)
the name of the ref checked that was chosen (which is CHECK_GIT_REMOTE_URL_REACHABILITY) makes it clear we are probing for existence, this could help
if you want to be polite with the administrators of the server you are probing
and give them a chance to understand why they receive these probes if they
monitor anything.
By disabling asking for credentials, then listing the remote head only:
export GIT_TERMINAL_PROMPT=0
git ls-remote "${repo}" HEAD &> /dev/null
The fastest and most-reliable way I've found in bash is this:
if timeout 30s git ls-remote --tags > /dev/null 2>&1; then
# Note: it takes 2~4 sec to get to here.
echo "git server IS available"
else
# Note: it takes 30 seconds (as specified by `timeout`) to get to here.
echo "git server is NOT available"
fi
Optionally increase the timeout 30s value to a larger number of seconds if your server is unable to respond under normal conditions within that amount of time.
For a full and detailed explanation, see my main answers here: