如何检测 GIT 服务器是否处于活动状态?

How can I detect if a GIT server is active?

服务器:Atlassian Bitbucket v4.14.3(又名 Stash) 客户端:git 版本 2.17.1(在 Linux Ubuntu 18LTS 上)

检测 GIT 服务器是否存在并提供服务的最佳方法是什么?

用例 1:Bitbucket 服务器每天停机以执行完整备份。在备份期间,它不响应请求,任何 'git clone and git push' 命令都会失败(我们从脚本发出这些命令)。 在发出 'clone' 或 'push' 之前,我想知道 GIT 服务器是否在生产中以避免错误。

用例 2:Bitbucket 服务器有时会宕机(升级、维护等)。和上面的情况类似,我想在发出'clone'或'push'之前知道它是否在生产中以避免错误。

Bitbucket 服务器有一些 API 来检查吗? git 客户端是否有命令来检查它? (我更喜欢这个选项,以避免对服务器的依赖)

我试过 'git ls-remote -h ssh:/reponame --exit-code' ,但我想知道是否有更好的选择,我不必提供存储库名称。

您可以发出几乎任何您喜欢的 API 命令来检查服务是否已启动。例如,您可以 get info for the current user。这并不意味着 API 稍后仍会出现。

"Check then do" 不起作用。考虑以下场景。

  1. 检查 Bitbucket 是否启动。
  2. 起来了!
  3. Bitbucket 出现故障。
  4. 发出 Bitbucket 命令。
  5. 命令失败。

这是计算机科学中的一个常见主题。其他示例包括...

  1. 检查文件是否存在。
  2. 存在!
  3. 文件被删除。
  4. 尝试打开文件。
  5. 打开失败。

您想检查是否启动并一次性发出命令,称为"atomic",因为这两个操作不能分开。对于文件,您只需尝试打开文件并查找错误。对于 Git,发出 git 命令并检查它是否成功。

对于可能需要多个命令的整个过程,最安全的做法是编写一个健壮的系统,可以处理过程中任何时候的错误。这意味着能够自动重试失败的网络调用,例如 git pull,并能够重新启动在中间失败的进程。

这是我最终处理它的方式(请注意,根据下面的评论,最好的方法是在发出所需的 git 命令后检查这些错误,以使其成为原子操作):

1- 使用存储库名称执行 'git ls-remote',并检测它是否 returns 为 0(没有问题)或其他。我得到的 'something else' 值为 128。

2a- 如果 'ls-remote' 返回的不是零,请确保服务器可访问。寻找 'Git server not found:'

3b- elif,检查 GIT 服务器是否处于维护模式。因为我的服务器是 Bitbucket,所以我寻找 'Bitbucket is currently unavailable'。

3c- elif,检查 GIT 服务器是否正在重启。我在重启期间得到 'Connection refused'。

3d-elif,确认存储库存在。 'Repository not found' 的 stderr 给出了提示。

3- 执行所需的 git 命令(然后检查错误)。