如何检查远程git存储库URL的有效性?

Hig*_*ife 45 git url bash curl github

在bash脚本中,验证git URL指向有效git repo并且脚本有权从中读取的最简单方法是什么?

应该支持的协议是git@,https://git://.Curl在git://协议上失败.

git@github.com:UserName/Example.git
https://UserName@github.com/UserName/Example.git
git://github.com/UserName/Example.git
Run Code Online (Sandbox Code Playgroud)

注意:我不是要求检查URL是否在语法上正确,我需要验证在bash脚本中输入的URL位置是否存在repo.

Von*_*onC 41

本期所述,您可以使用git ls-remote来测试您的地址.

如果你需要调试git调用set GIT_TRACE=1.例如:

env GIT_PROXY_COMMAND=myproxy.sh GIT_TRACE=1 git ls-remote https://...
Run Code Online (Sandbox Code Playgroud)

" git ls-remote"是我所知道的最快的方式来测试与远程存储库的通信而不实际克隆它.因此它可以用来测试这个问题.

您可以在" git ls-remote任何仓库中返回128 "中看到它用于检测地址问题.


Hig*_*ife 40

虽然VonC的答案是正确的,但这是我最终使用的内容:

git ls-remote将返回有关存储库的信息,默认情况下,这是HEAD,所有分支和标记,以及每个条目的提交ID.例如:

$ 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
Run Code Online (Sandbox Code Playgroud)

git ls-remote 成功时返回代码0,失败时返回错误代码128.

如果无法访问存储库,例如,如果您没有查看存储库的权限,或者该位置不存在存储库,git ls-remote则将返回:

fatal: The remote end hung up unexpectedly
Run Code Online (Sandbox Code Playgroud)

要在bash脚本中使用它,以下内容将起作用...

git ls-remote "$SITE_REPO_URL" &>-
if [ "$?" -ne 0 ]; then
    echo "[ERROR] Unable to read from '$SITE_REPO_URL'"
    exit 1;
fi
Run Code Online (Sandbox Code Playgroud)

(注:&>-沉默标准错误和标准输出,因此命令将不会输出任何东西)

  • 我建议不要使用`&> - `作为可移植脚本,因为它似乎是一个bash扩展.在其他shell中,此语法将无法按预期工作.虽然有类似的语法(`>& - 2>& - `),但功能并不相同 - 它将关闭文件描述符而不是静默重定向它们,这会导致许多程序出错.您可以使用`>/dev/null 2>&1`代替. (6认同)