git:如果 HTTP 请求失败,请重试



在我们的持续集成环境中,我们大量使用git clonegit update

有时网络或中央 git 服务器不可靠。

有没有办法告诉 git 如果 http 请求失败时重试?

例:

500 访问时出现内部服务器错误 https://example.com/repos/foo_bar/info/refs?service=git-upload-pack

你可以运行这样的脚本,而不是直接调用 git。

#!/bin/bash
REALGIT=/usr/bin/git
RETRIES=3
DELAY=10
COUNT=1
while [ $COUNT -lt $RETRIES ]; do
  $REALGIT $*
  if [ $? -eq 0 ]; then
    RETRIES=0
    break
  fi
  let COUNT=$COUNT+1
  sleep $DELAY
done

有没有办法告诉 git 如果 http 请求失败时重试?

没有 git 本身,它本身不支持该功能。

但有趣的是,包装 git 命令以重试其执行的想法之前已经完成:请参阅" git-retry (1) 手册页 ",depot_tools的一部分,用于处理 Chromium 开发的工具集合。

shell 包装器git-retry使用以下选项调用 python 脚本git_retry.py

'-v', '--verbose', default=0,

增加详细程度;可以多次指定

'-c', '--retry-count', default=GitRetry.DEFAULT_RETRY_COUNT (5),

重试次数(默认值 = 5)

'-d', '--delay', default=GitRetry.DEFAULT_DELAY_SECS (3.0)

指定连续重试之间等待的时间量(以秒为单位)(默认值 = 3 秒)。此值可以为零。

'-D', '--delay-factor', default=2

应用于连续故障之间的延迟的指数因子(默认值 = %默认值)。如果此值为零,则延迟将线性增加。将此设置为 1 以具有恒定(非递增)延迟。


注意:带有子模块的存储库的 git 克隆将始终尝试克隆子模块两次(一次重试)。请参阅"有没有办法从失败的地方继续 Git 克隆?

这是 git 命令的包装器,它可以识别命令何时失败并重试

git retry [-v] [-c COUNT] [-d DELAY] [-e] — <git_subcommand>
有关

此内容的更多信息,请参见此处。

运行以下命令

而 ! git push; 做睡眠 7; 完成

偶然发现这一点,因为我想让我的一些脚本对网络问题更具弹性。我也进行了 bash 重试,并试图使其尽可能简洁。

我只是想把我的版本留在这里,以防它对任何人有帮助:

set -Eeuo pipefail
RETRIES_NO=5
RETRY_DELAY=3
for i in $(seq 1 $RETRIES_NO); do
  git my-maybe-failing-command && break
  sleep ${RETRY_DELAY}
  [[ $i -eq $RETRIES_NO ]] && echo "Failed to execute git cmd after $RETRIES_NO retries" && exit 1
done
echo "success"
将其

编写为使用命令、重试编号和延迟调用的函数也非常容易,以重试所需的任何类型的 bash 命令。

最新更新