git "ping": 检查远程仓库是否存在

Jo *_*iss 92 git

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

git ls-remote -h "$REPO_URL" &> /dev/null
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Pet*_*aut 89

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


小智 19

如果使用--exit-code参数,则可以跳过将输出发送到null. 它只会在出错时返回一些东西。

此外,您可以使用-h参数仅显示头部引用。

git ls-remote --exit-code -h "$REPO_URL"
Run Code Online (Sandbox Code Playgroud)

  • `-h` 是个好主意。然而,`--exit-code` 在这里不是正确的选择。手册页说:*当在远程存储库中找不到匹配的引用时,以状态“2”退出。* 这意味着 `git ls-remote --exit-code "$REPO_URL"` 将失败,因为一个空的仓库有只用 `git init` 初始化。 (2认同)

vaa*_*aab 5

长话短说:

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

用法:

if git-remote-url-reachable "$url"; then
   ## code
fi
Run Code Online (Sandbox Code Playgroud)

它在做什么?

这只是之前所述的所有注释/解决方案的方便混搭,并进行了一些小调整、bash 复制粘贴就绪函数和使用代码示例,以使其清晰可见。你会注意到:

  • 它限制输出,因为检查的参考(此处CHECK_GIT_REMOTE_URL_REACHABILITY)可能在远程服务器上不存在,并且git没有任何回应。我们依赖这样一个事实:git 在不存在的 ref 上仍然会以错误级别 0 退出。这里唯一的区别是,与请求相比,在网络上传输的输出略少HEAD(并且比不请求引用甚至仅限于头要少得多),并且这也需要更少的输出/dev/null(但这无论如何,最后一个花费的时间可以忽略不计)

  • 所选择的检查的引用的名称(即CHECK_GIT_REMOTE_URL_REACHABILITY清楚地表明我们正在探测是否存在,如果您想对正在探测的服务器的管理员保持礼貌并让他们有机会了解他们收到的原因,这可能会有所帮助这些探测器是否监视任何东西。

  • 只要您使用 bash,这种语法就更简洁一些: &>/dev/null (2认同)