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?
Super User is a question and answer site for computer enthusiasts and power users. It only takes a minute to sign up.
Sign up to join this communityI'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"
-h
is a great idea. However, --exit-code
is not the right choice here. The man page says: Exit with status "2" when no matching refs are found in the remote repository. This means that git ls-remote --exit-code "$REPO_URL"
will fail for an empty repo that has only just been initialized with git init
.
You can narrow output by using something like git ls-remote "$REPO_URL" HEAD
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 is probably nonexistent, as git
will still exit with error-level 0 on non-matching 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 ref checked 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
/dev/null
) should be fairly small.