2016-01-26 97 views
5

在我們的持續集成環境中,我們的使用量非常大,爲git clone和​​。git:如果http請求失敗,則重試

有時網絡或中央git服務器不可靠。

如果http請求失敗,是否有辦法告訴git重試?

例子:

500內部服務器錯誤,同時訪問 https://example.com/repos/foo_bar/info/refs?service=git-upload-pack

+1

Git命令應返回一個正確的[退出代碼](https://en.wikipedia.org/wiki/Exit_status),您可以檢查該命令是否成功。如果沒有成功,則在中止前重試N次。 – poke

回答

5

有沒有辦法告訴git的重試如果HTTP請求失敗?

沒有git本身,它本身不支持該功能。

但有趣的是,包裝git命令以重試其執行的想法已經完成:請參閱「git-retry(1) Manual Page」,depot_tools, a collection of tools for dealing with Chromium development的一部分。

shell wrapper 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克隆與子模塊回購將始終嘗試克隆一個子模塊兩次(一個重試)。參見「Is there any way to continue Git clone from the point where it failed?」。

+0

此解決方案不會執行任何簡單的shell腳本,但會增加對外部庫的依賴性 – Vorsprung

7

您可以運行,而不是直接調用的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 
+0

這是我在代碼中的評論;) - 正是我對它的想象,很好! – poke

+0

我想上面的解決方案也會重試'git grep ...'。 – guettli

3

This是圍繞GIT中的命令的包裝,它在命令失敗時識別和重試

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

在此的更多信息可以發現here