How to check the validity of a remote git repository URL?

GitBashUrlCurlGithub

Git Problem Overview


Within a bash script, what would be the simplest way to verify that a git URL points to a valid git repo and that the script has access to read from it?

Protocols that should be supported are git@, https://, and git://. Curl fails on the git:// protocol.

git@github.com:UserName/Example.git
https://UserName@github.com/UserName/Example.git
git://github.com/UserName/Example.git

Note: I'm not asking to check to see if a URL is syntactically correct, I need to verify that a repo exists at the URL location entered from within a bash script.

Git Solutions


Solution 1 - Git

As seen in this issue, you can use git ls-remote to test your address.

> If you need to debug the git calls set GIT_TRACE=1. eg:

env GIT_PROXY_COMMAND=myproxy.sh GIT_TRACE=1 git ls-remote https://...

> "git ls-remote" is the quickest way I know to test communications with a remote repository without actually cloning it. Hence its utility as a test for this issue.

You can see it used for detecting an address issue in "git ls-remote returns 128 on any repo".

Solution 2 - Git

Although VonC's answer is correct, here's what I ended up using:

git ls-remote will return information about a repository, by default this is HEAD, all branches and tags, along with the commit ID for each entry. e.g.:

$ git ls-remote git://github.com/user/repo.git
<commit id>    HEAD
<commit id>    refs/heads/example_branch
<commit id>    refs/heads/master
<commit id>    refs/tags/v1.0.2
<commit id>    refs/tags/v1.0.0

git ls-remote returns code 0 on success, error code 128 on failure.

If the repo is unreachable, for example, if you don't have permission to view the repository, or if a repository doesn't exist at that location, git ls-remote will return:

fatal: The remote end hung up unexpectedly

To use this in a bash script, the following will work...

git ls-remote "$SITE_REPO_URL" > /dev/null 2>&1
if [ "$?" -ne 0 ]; then
    echo "[ERROR] Unable to read from '$SITE_REPO_URL'"
    exit 1;
fi

(Note: The > /dev/null 2>&1 silences stderr and stdout, so the command won't output anything)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHighway of LifeView Question on Stackoverflow
Solution 1 - GitVonCView Answer on Stackoverflow
Solution 2 - GitHighway of LifeView Answer on Stackoverflow