git "ping": Überprüfen Sie, ob das Remote-Repository existiert

76

Ich möchte wissen, ob ein Remote-Repository vorhanden ist. Folgendes habe ich mir ausgedacht:

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

Gibt es einen besseren Weg?

Jo Liss
quelle
4
Es scheint eine gute Wahl zu sein. Der Aufwand für die „zusätzliche Arbeit“ beim Abrufen und Formatieren der Liste der Refs (an die dann gesendet wird /dev/null) sollte relativ gering sein.
Chris Johnsen
Die Antwort sollte lauten: Nein, es gibt keinen besseren Weg.
Timo

Antworten:

70

Ich denke, der git ls-remoteBefehl ist so ziemlich für diesen Zweck gemacht.

Peter Eisentraut
quelle
yep, scheint dies zu funktionieren, aber können Sie, bitte, eine Erklärung liefern und sagen , ob diese 100% , dass ich das Repo klonen
vladkras
15

Wenn Sie ein --exit-codeArgument verwenden, können Sie das Senden von Ausgaben an überspringen null. Es wird nur im Fehlerfall etwas zurückgegeben.

Sie können -hargument auch verwenden, um nur Kopfverweise anzuzeigen.

git ls-remote --exit-code -h "$REPO_URL"
Oleksiy Chystoprudov
quelle
-hist eine großartige Idee. Allerdings --exit-codeist hier nicht die richtige Wahl. Die Manpage sagt: Beenden Sie mit dem Status "2", wenn keine übereinstimmenden Referenzen im Remote-Repository gefunden werden. Dies bedeutet, dass git ls-remote --exit-code "$REPO_URL"für ein leeres Repo, das gerade erst initialisiert wurde , ein Fehler auftritt git init.
Jo Liss
3

Sie können die Ausgabe eingrenzen, indem Sie so etwas wie verwenden git ls-remote "$REPO_URL" HEAD

nur
quelle
Es hängt für immer.
Timo
1
@Timo, dann hast du wahrscheinlich entweder einen nicht reagierenden Server oder deine Verbindung oder einen kaputten Git-Client. Beispielsweise wird der Netzwerkanschluss gefiltert. Weitere Untersuchungen ähneln dem, was passiert, wenn Ihr Ping nicht reagiert :). Sie können beispielsweise überprüfen, ob Sie eine Verbindung über netcat oder openssl s_client oder tracepath hergestellt haben .
Uhr
0

TL; DR:

git ls-remote ist der Weg, hier ist eine Shell-Ready-Funktion für den schnellen Zugriff:

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

Verwendungszweck:

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

Was macht es ?

Dies ist nur eine praktische Zusammenfassung aller zuvor genannten Kommentare / Lösungen mit einigen kleinen Änderungen, einer Bash-Copy-Paste-Ready-Funktion und einem Verwendungscode-Beispiel, um es kristallklar zu machen. Sie werden feststellen, dass:

  • es begrenzt die Ausgabe, da die überprüfte Referenz wahrscheinlich nicht vorhanden ist, da git sie bei nicht übereinstimmender Referenz immer noch mit der Fehlerstufe 0 beendet wird . Der einzige Unterschied ist , dass es etwas weniger ausgegeben wird auf dem Netzwerk zu übertragen , im Vergleich zu fragen HEAD(und viel weniger als nicht für einen Schiedsrichter fragen , oder sogar nur Köpfe Begrenzung), und dies ist auch weniger Leistung in werfen /dev/null(aber die letzte dauert sowieso vernachlässigbar lange)

  • Die überprüfte Referenz macht deutlich, dass wir nach dem Vorhandensein suchen . Dies kann hilfreich sein, wenn Sie höflich mit den Administratoren des zu prüfenden Servers umgehen möchten und ihnen die Möglichkeit geben, zu verstehen, warum sie diese Tests erhalten, wenn sie etwas überwachen.

vaab
quelle