如何检查远程Git仓库URL的有效性?

60

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

应该支持的协议包括 git@, https://, 和 git://。 Curl 在 git:// 协议上失败。

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

注意:我不是要求检查URL的语法是否正确,我需要在Bash脚本中验证输入的URL位置上存在一个存储库。

2个回答

57

此问题所示,您可以使用git ls-remote测试您的地址。

如果您需要调试git调用,请设置set GIT_TRACE=1。例如:

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

"git ls-remote"是我所知道的最快速的方法,用于测试与远程仓库的通信而无需实际克隆它。因此,它在检测此问题时非常有用。

您可以在"git ls-remote returns 128 on any repo"中查看其用于检测地址问题。


Google Code的链接已经失效,msysgit及其问题跟踪器已经迁移到GitHub。我在GitHub上没有找到以前的问题,可能是因为我不确定应该搜索什么。 - Attila Csipak
1
@AttilaCsipak 谢谢。我已经恢复或更新了缺失的链接。 - VonC

53

尽管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

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

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

fatal: The remote end hung up unexpectedly

要在bash脚本中使用,可以使用以下方法...

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

(注意:> /dev/null 2>&1会将stderr和stdout静音,因此该命令不会输出任何内容)


7
我建议不要在可移植脚本中使用 &>- ,因为它似乎是 Bash 的扩展功能。在其他 shell 中,此语法将无法按预期工作。虽然有类似的语法 (>&- 2>&-),但其功能并不等同--它会关闭文件描述符而不是静默地重定向它们,这将导致许多程序出现错误。相反,你可以使用 > /dev/null 2>&1 - alexia
我添加了GIT_ASKPASS=true以防止在错误的URL上被提示输入用户名和密码。 - codeDr
有没有一种不使用git的方法来进行检查? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接