git “ping”: vérifie l'existence d'un référentiel distant

76

J'aimerais savoir s'il existe un référentiel distant. Voici ce que je suis venu avec:

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

Y a-t-il une meilleure façon?

Jo Liss
la source
4
Cela semble être un bon choix. La surcharge du «travail supplémentaire» de récupération et de formatage de la liste des références (qui est ensuite envoyée à /dev/null) devrait être assez faible.
Chris Johnsen
La réponse devrait être: non, il n'y a pas de meilleur moyen.
Timo

Réponses:

70

Je pense que la git ls-remotecommande est à peu près faite à cette fin.

Peter Eisentraut
la source
Oui, cela semble fonctionner, mais pouvez-vous, s'il vous plaît, fournir des explications et dire si ce 100% que je peux cloner ce repo
vladkras
15

Si vous utilisez un --exit-codeargument, vous pouvez ignorer l'envoi de la sortie null. Il ne retournera quelque chose qu'en cas d'erreur.

En outre, vous pouvez utiliser un -hargument pour afficher uniquement les références de têtes.

git ls-remote --exit-code -h "$REPO_URL"
Oleksiy Chystoprudov
la source
-hC'est une bonne idée. Cependant, ce --exit-coden'est pas le bon choix ici. La page de manuel dit: Quittez avec le statut "2" lorsqu'aucune référence correspondante n'est trouvée dans le référentiel distant. Cela signifie que git ls-remote --exit-code "$REPO_URL"cela échouera pour un dépôt vide qui vient juste d'être initialisé avec git init.
Jo Liss
3

Vous pouvez limiter la sortie en utilisant quelque chose comme git ls-remote "$REPO_URL" HEAD

seulement
la source
Il pend pour toujours.
Timo
1
@Timo, vous avez probablement un serveur qui ne répond pas, votre connexion ou un client git cassé. Par exemple, le port réseau est filtré. Les investigations ultérieures sont un peu similaires à ce qui se passe lorsque votre ping ne répond pas :). Par exemple, vous pouvez essayer de vérifier si la connexion est établie via netcat ou s_client ou tracepath de openssl .
Seulement
0

TL; DR:

git ls-remote Voici le moyen, voici une fonction prête pour le shell pour un accès rapide:

  ## 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
  }

Usage:

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

Qu'est-ce que ça fait ?

Ceci est juste un mélange pratique de tous les commentaires / solutions mentionnés précédemment avec quelques modifications mineures, une fonction de copie-coller prête à l'emploi et un exemple de code d'utilisation pour le rendre parfaitement clair. Vous noterez que:

  • il limite la sortie car la référence vérifiée est probablement inexistante, car git elle se terminera toujours avec le niveau d'erreur 0 sur la référence non correspondante . La seule différence est qu’il y a un peu moins de sorties à transférer sur le réseau que de demander HEAD(et beaucoup moins que de ne pas demander une référence ou même de se limiter aux têtes), ce qui est également moins une sortie à utiliser /dev/null(mais cela le dernier prend de toute façon un temps négligeable)

  • le ref coché indique clairement que nous sondons pour l'existence , cela pourrait aider si vous voulez être poli avec les administrateurs du serveur que vous sondez et leur donner une chance de comprendre pourquoi ils reçoivent ces sondes s'ils surveillent quoi que ce soit.

vaab
la source