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?


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.


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"

-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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.