Dans un script bash, quelle serait la manière la plus simple de vérifier qu'une URL git pointe vers un référentiel git valide et que le script a accès pour y lire?
Les protocoles qui doivent être pris en charge sont git@
, https://
, et git://
. Curl échoue sur le git://
protocole.
[email protected]:UserName/Example.git
https://[email protected]/UserName/Example.git
git://github.com/UserName/Example.git
Remarque: Je ne demande pas de vérifier si une URL est syntaxiquement correcte, je dois vérifier qu'un dépôt existe à l'emplacement URL entré à partir d'un script bash.
Comme vu dans ce problème , vous pouvez utiliser git ls-remote pour tester votre adresse.
Si vous devez déboguer les appels git
set GIT_TRACE=1
. par exemple:
env GIT_PROXY_COMMAND=myproxy.sh GIT_TRACE=1 git ls-remote https://...
"
git ls-remote
"est le moyen le plus rapide que je connaisse pour tester les communications avec un référentiel distant sans le cloner. D'où son utilité comme test pour ce problème.
Vous pouvez le voir utilisé pour détecter un problème d'adresse dans " git ls-remote
renvoie 128 sur n'importe quel dépôt ".
Bien que la réponse de VonC soit correcte, voici ce que j'ai fini par utiliser:
git ls-remote renverra des informations sur un référentiel, par défaut il s'agit de HEAD, de toutes les branches et balises, ainsi que de l'ID de validation pour chaque entrée. par exemple.:
$ git ls-remote git://github.com/user/repo.git
<commit id> HEAD
<commit id> refs/heads/example_branch
<commit id> refs/heads/master
<commit id> refs/tags/v1.0.2
<commit id> refs/tags/v1.0.0
git ls-remote
renvoie le code 0 en cas de succès, le code d'erreur 128 en cas d'échec.
Si le référentiel est inaccessible, par exemple, si vous n'êtes pas autorisé à afficher le référentiel, ou si un référentiel n'existe pas à cet emplacement, git ls-remote
renverra:
fatal: The remote end hung up unexpectedly
Pour l'utiliser dans un script bash, ce qui suit fonctionnera ...
git ls-remote "$SITE_REPO_URL" &>-
if [ "$?" -ne 0 ]; then
echo "[ERROR] Unable to read from '$SITE_REPO_URL'"
exit 1;
fi
( Remarque: Le &>-
fait taire stderr et stdout, donc la commande ne sortira rien)