git „ping”: sprawdź, czy istnieje zdalne repozytorium

76

Chciałbym wiedzieć, czy istnieje zdalne repozytorium. Oto, co wymyśliłem:

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

Czy jest jakiś lepszy sposób?

Jo Liss
źródło
4
Wygląda na dobry wybór. Narzut związany z „dodatkową pracą” związaną z pobieraniem i formatowaniem listy referencji (która następnie jest wysyłana /dev/null) powinien być dość mały.
Chris Johnsen,
Odpowiedź powinna brzmieć: Nie, nie ma lepszego sposobu.
Timo

Odpowiedzi:

70

Wydaje mi się, że git ls-remotepolecenie jest właściwie wykonane w tym celu.

Peter Eisentraut
źródło
tak, wydaje się, że to działa, ale czy możesz, proszę, podać jakieś wyjaśnienie i powiedzieć, czy to 100%, że mogę sklonować to repo
vladkras 24.10.16
15

Jeśli użyjesz --exit-codeargumentu, możesz pominąć wysyłanie danych wyjściowych do null. Zwróci coś tylko w przypadku błędu.

Możesz także użyć -hargumentu, aby wyświetlić tylko odniesienia do nagłówków.

git ls-remote --exit-code -h "$REPO_URL"
Oleksiy Chystoprudov
źródło
-hto świetny pomysł. Nie --exit-codejest to jednak właściwy wybór. Strona podręcznika mówi: Wyjdź ze statusem „2”, gdy w zdalnym repozytorium nie znaleziono pasujących odnośników. Oznacza to, że git ls-remote --exit-code "$REPO_URL"zakończy się niepowodzeniem dla pustego repozytorium, które zostało właśnie zainicjowane git init.
Jo Liss
3

Możesz zawęzić wyniki, używając czegoś takiego git ls-remote "$REPO_URL" HEAD

ony
źródło
Wisi wiecznie.
Timo,
1
@ Timo, prawdopodobnie masz albo niereagujący serwer, albo połączenie albo zepsuty klient git. Na przykład port sieciowy jest filtrowany. Dalsze badania są trochę podobne do tego, co dzieje się, gdy twój ping nie odpowiada :). Na przykład można spróbować sprawdzić, czy masz połączenie, które poprzez netcata lub openssl s_client lub narzÄ ™ dziem tracepath .
ony
0

TL; DR:

git ls-remote Oto sposób na gotowość powłoki dla szybkiego dostępu:

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

Stosowanie:

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

Co to robi ?

Jest to po prostu wygodne połączenie wszystkich wcześniejszych komentarzy / rozwiązań z kilkoma drobnymi poprawkami, funkcja gotowa do kopiowania i wklejania bash oraz przykładowy kod użytkowy, aby był krystalicznie czysty. Zauważysz, że:

  • ogranicza dane wyjściowe, ponieważ sprawdzone odwołanie prawdopodobnie nie istnieje, podobnie jak git wyjście z poziomu błędu 0 przy niepasującym oznaczeniu . Jedyna różnica polega na tym, że w sieci jest nieco mniej danych do przesłania w porównaniu z prośbą HEAD(i znacznie mniej niż bez prośby o referencję lub nawet ograniczenie tylko do głów), a to także mniej mocy do oddania /dev/null(ale to ostatni i tak zajmuje mało czasu)

  • sprawdzona referencja wyjaśnia, że ​​sprawdzamy istnienie , może to pomóc, jeśli chcesz być uprzejmy wobec administratorów serwera, który sondujesz, i dać im szansę zrozumienia, dlaczego otrzymali te sondy, jeśli coś monitorują.

Vaab
źródło