git“ ping”:检查远程存储库是否存在


76

我想知道是否存在远程存储库。这是我想出的:

git ls-remote -h "$REPO_URL" &> /dev/null

有什么更好的办法吗?


4
似乎是个不错的选择。提取和格式化ref列表(然后发送到/dev/null)的“额外工作”的开销应该很小。
克里斯·约翰森

答案应该是:不,没有更好的方法。
Timo

Answers:


70

我认为该git ls-remote命令几乎就是为此目的而做出的。


是的,这似乎工作,但你能,请提供一些解释,并告诉如果这100%是我可以克隆回购
vladkras

15

如果使用--exit-code参数,则可以跳过将输出发送到null。仅在出现错误的情况下才返回某些内容。

另外,您可以使用-h参数仅显示heads引用。

git ls-remote --exit-code -h "$REPO_URL"

-h是个好主意。但是,--exit-code这里不是正确的选择。手册页显示:当在远程存储库中找不到匹配的引用时,以状态“ 2”退出。这意味着git ls-remote --exit-code "$REPO_URL"对于仅使用初始化的空存储库将失败git init
乔·利斯

3

您可以使用类似的方法缩小输出范围 git ls-remote "$REPO_URL" HEAD


它永远挂着。
蒂莫

1
@Timo,那么您可能没有响应的服务器,连接或git客户端损坏。例如,网络端口被过滤。进一步的调查有点类似于您的ping不响应时发生的情况:)。例如,您可以尝试检查是否通过netcatopenssl s_clienttracepath建立了连接。
ONY

0

TL; DR:

git ls-remote 就是这样,这是一个快速访问shell的函数:

  ## 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
  }

用法:

if git-remote-url-reachable "$url"; then
   ## code
fi

到底在做什么

这只是前面提到的所有注释/解决方案的便捷汇总,并进行了一些小调整,bash复制粘贴准备功能和用法代码示例,以使其清晰可见。您会注意到:

  • 它限制了输出,因为检查的参考可能不存在,因为git 在不匹配的ref上仍然会以错误级别0退出。唯一的区别是与请求相比,网络上要传输的输出HEAD要少得多(比不要求提供参考或什至仅限于头数要少得多),并且要强制转换的输出也要少/dev/null(但这最后一个花费的时间可以忽略不计)

  • 所检查的ref 清楚表明我们正在探测存在性,如果您希望对所探测的服务器的管理员保持礼貌,这可能会有所帮助,并让他们有机会了解为什么他们监视任何东西时会收到这些探测。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.