在我们的持续集成环境中,我们非常频繁地使用git clone
和git update
。
有时网络或中央git服务器不可靠。
有没有一种方法告诉git如果HTTP请求失败就重试呢?
例如:
访问https://example.com/repos/foo_bar/info/refs?service=git-upload-pack时出现500内部服务器错误。
在我们的持续集成环境中,我们非常频繁地使用git clone
和git update
。
有时网络或中央git服务器不可靠。
有没有一种方法告诉git如果HTTP请求失败就重试呢?
例如:
访问https://example.com/repos/foo_bar/info/refs?service=git-upload-pack时出现500内部服务器错误。
#!/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 grep ...
进行重试。 - guettli$REALGIT "$@"
替换 $REALGIT $*
。 - JGK有没有办法告诉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),
'-d', '--delay', default=GitRetry.DEFAULT_DELAY_SECS (3.0)
'-D', '--delay-factor', default=2
运行以下命令
while ! git push; do sleep 7; done
really_fetch
中,非常完美。 - Francesco Dondi我也偶然发现了这个问题,因为我想让我的一些脚本更加具有网络问题的弹性。我也选择了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 命令也非常容易。