2016-01-26 21 views
5

Continuous Integration環境では、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

httpリクエストが失敗した場合に再試行するようにgitを伝える方法はありますか?

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のクローンは常に二回(1回のリトライ)サブモジュールのクローンを作成しようとします。 「Is there any way to continue Git clone from the point where it failed?」を参照してください。

+0

このソリューションは、単純なシェルスクリプトが行うことはしませんが、外部ライブラリへの依存性を追加します – 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 retry [-v] [-c COUNT] [-d DELAY] [-e] — <git_subcommand> 

詳しい情報はhereを見つけることができます認識し、gitのコマンドのラッパーです。

関連する問題