git "ping": controlla se esiste un repository remoto


76

Vorrei sapere se esiste un repository remoto. Ecco cosa mi è venuto in mente:

git ls-remote -h "$REPO_URL" &> /dev/null

C'è un modo migliore?


4
Sembra una buona scelta. Il sovraccarico del "lavoro extra" di recupero e formattazione dell'elenco di riferimenti (che viene quindi inviato a /dev/null) dovrebbe essere abbastanza piccolo.
Chris Johnsen, il

La risposta dovrebbe essere: No, non esiste un modo migliore.
Timo,

Risposte:


70

Penso che il git ls-remotecomando sia praticamente fatto per questo scopo.


sì, questo sembra funzionare, ma puoi, per favore, fornire qualche spiegazione e dire se questo 100% che posso clonare quel repo
Vladkras

15

Se usi l' --exit-codeargomento puoi saltare l'invio dell'output a null. Restituirà qualcosa solo in caso di errore.

Inoltre, puoi usare l' -hargomento per mostrare solo i riferimenti head.

git ls-remote --exit-code -h "$REPO_URL"

-hè un'ottima idea. Tuttavia, --exit-codenon è la scelta giusta qui. La pagina man dice: Esci con lo stato "2" quando non si trovano riferimenti corrispondenti nel repository remoto. Ciò significa che git ls-remote --exit-code "$REPO_URL"fallirà per un repository vuoto che è stato appena inizializzato con git init.
Jo Liss,

3

È possibile restringere l'output utilizzando qualcosa di simile git ls-remote "$REPO_URL" HEAD


Si blocca per sempre.
Timo,

1
@Timo, allora probabilmente hai un server che non risponde o la tua connessione o client git rotto. Ad esempio la porta di rete è filtrata. Ulteriori indagini sono in qualche modo simili a ciò che accade quando il ping non risponde :). Ad esempio, puoi provare a verificare se la connessione viene stabilita tramite netcat o openssl s_client o tracepath .
ony

0

TL; DR:

git ls-remote è il modo, ecco una funzione pronta per la shell per un rapido accesso:

  ## Returns errlvl 0 if $1 is a reachable git remote url 
  git-remote-url-reachable() {
      git ls-remote "$1" CHECK_GIT_REMOTE_URL_REACHABILITY >/dev/null 2>&1
  }

Uso:

if git-remote-url-reachable "$url"; then
   ## code
fi

Cosa sta facendo ?

Questo è solo un comodo mash-up di tutti i commenti / soluzioni precedentemente enunciati con alcune piccole modifiche, una funzione di bash copia-incolla pronta e un esempio di codice d'uso per renderlo cristallino. Noterai che:

  • limita l'output poiché il riferimento verificato è probabilmente inesistente, poiché git uscirà comunque con livello di errore 0 su riferimento non corrispondente . L'unica differenza qui è che ci sono un po 'meno output da trasferire sulla rete rispetto a ask HEAD(e molto meno che non chiedere un ref o addirittura limitarsi ai soli head), e questo è anche meno output da inserire /dev/null(ma questo l'ultimo impiega comunque tempo trascurabile)

  • il riferimento controllato chiarisce che stiamo verificando l'esistenza , questo potrebbe aiutare se vuoi essere educato con gli amministratori del server che stai sondando e dare loro la possibilità di capire perché ricevono queste sonde se controllano qualcosa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.