Git:如果 HTTP 请求失败则重试

11

1
Git命令应该返回一个适当的退出代码,你可以检查命令是否成功。如果没有成功,只需重试N次,然后再放弃。 - poke
5个回答

9
您可以运行这样的脚本,而不是直接调用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

这是我的代码注释 ;) - 正如我所想象的那样,很棒! - poke
我猜上面的解决方案也会对 git grep ... 进行重试。 - guettli
1
根据 https://dev59.com/x2ct5IYBdhLWcg3wI6J6,你应该使用 $REALGIT "$@" 替换 $REALGIT $* - JGK

8

有没有办法告诉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

指数因子应用于相继故障之间的延迟(默认值为%default)。如果这是零,则延迟将线性增加。将其设置为1以获得恒定(非递增)延迟。
注意:使用 git clone 克隆包含子模块的仓库时,子模块会被尝试克隆两次(重试一次)。请参见“有没有办法从失败点继续进行Git克隆?”。

这个解决方案并没有做任何简单的shell脚本不能做的事情,但是它增加了对外部库的依赖。 - Vorsprung

5
这是一个git命令的包装器,它可以识别命令失败并自动重试。请参考此链接获取更多信息。
git retry [-v] [-c COUNT] [-d DELAY] [-e] — <git_subcommand>

您可以在此处找到更多关于此的信息。


4

运行以下命令

while ! git push; do sleep 7; done


我已经将其放入别名really_fetch中,非常完美。 - Francesco Dondi

1

我也偶然发现了这个问题,因为我想让我的一些脚本更加具有网络问题的弹性。我也选择了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"

把这个写成一个函数并用命令 retry-number 和 delay 调用,重试想要的任何类型的 bash 命令也非常容易。


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