2016-01-26 22 views
5

W naszym środowisku ciągłej integracji bardzo intensywnie używamy git clone i git update.git: ponów próbę, jeśli żądanie http nie powiodło się

Czasami sieć lub centralny serwer git nie jest niezawodny.

Czy istnieje sposób, aby powiedzieć git, aby spróbować ponownie, jeśli żądanie http nie powiodło się?

Przykład:

500 Internal Server Error podczas dostępu https://example.com/repos/foo_bar/info/refs?service=git-upload-pack

+1

Polecenie Git powinno zwrócić właściwy [kod zakończenia] (https://en.wikipedia.org/wiki/Exit_status), który można sprawdzić, czy polecenie się powiodło. Jeśli to się nie uda, po prostu powtórz N razy, zanim przerwiesz. – poke

Odpowiedz

5

Czy istnieje sposób, aby powiedzieć git, aby ponowić próbę, jeżeli żądanie HTTP nie powiodło?

Brak samego git, nie obsługuje natywnie tej funkcji.

Ale co ciekawe, pomysł owijania polecenia git w celu powtórzenia jego wykonania został zrobiony wcześniej: patrz "git-retry(1) Manual Page", część depot_tools, a collection of tools for dealing with Chromium development.

shell wrapper git-retry wywołuje skrypt Pythona git_retry.py z następujących opcji:

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

Zwiększenie szczegółowości; można podać kilka razy

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

liczbę ponownych prób (domyślnie = 5)

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

Określa się czas (w sekundach) oczekiwania pomiędzy kolejnymi ponowne próby (domyślnie = 3 sekundy). Może to być zero.

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

Współczynnik wykładniczy stosuje się do opóźnień w między kolejnymi awariami (default =% domyślnych). Jeśli wynosi ona zero, opóźnienia wzrosną liniowo. Ustaw to na jedno, aby miało stałe (nie rosnące) opóźnienie.


Uwaga: klon git dla repo z modułem zawsze będzie dążył do klonowania submodule dwukrotnie (jeden ponawiania). Zobacz "Is there any way to continue Git clone from the point where it failed?".

+0

To rozwiązanie nie robi nic, co robi zwykły skrypt powłoki, ale dodaje zależność od biblioteki zewnętrznej – Vorsprung

7

Można uruchomić skrypt tak zamiast bezpośredniego wywoływania 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

To jest mój komentarz w kodzie;) - Dokładnie to sobie wyobrażałem, miło! – poke

+0

Domyślam się, że powyższe rozwiązanie spróbuje ponownie dla 'git grep ...'. – guettli

3

This jest owinięcie wokół komendy git, rozpoznaje, gdy komenda nie powiedzie się i ponawia

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

Więcej informacji na ten temat można znaleźć here.

Powiązane problemy