git "ping": перевірте, чи існує віддалений сховище


76

Я хотів би знати, чи існує віддалене сховище. Ось що я придумав:

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

Чи є кращий спосіб?


4
Це здається прекрасним вибором. Накладні «додаткові роботи» щодо отримання та форматування списку рефлексив (на які потім надсилаються /dev/null) повинні бути досить невеликими.
Кріс Джонсен

Відповідь повинна бути: Ні, кращого шляху немає.
Тимо

Відповіді:


70

Я думаю, що git ls-remoteкоманда в значній мірі зроблена для цієї мети.


так, це, здається, працює, але ви можете, будь ласка, надати трохи пояснень і сказати, чи це 100%, що я можу клонувати цю
репортаж

15

Якщо ви використовуєте --exit-codeаргумент, ви можете пропустити надсилання результатів до null. Він поверне щось лише у випадку помилки.

Крім того, ви можете використовувати -hаргумент для показу лише посилань на голови.

git ls-remote --exit-code -h "$REPO_URL"

-hвідмінна ідея. Однак --exit-codeтут не є правильним вибором. На головній сторінці написано: Вийдіть зі статусом "2", коли у віддаленому сховищі не знайдено відповідних посилань. Це означає, що git ls-remote --exit-code "$REPO_URL"не вдасться отримати порожнє репо, яке тільки що було ініціалізовано git init.
Джо Лісс

3

Ви можете звузити вихід, використовуючи щось подібне git ls-remote "$REPO_URL" HEAD


Він висить вічно.
Тимо

1
@Timo, то, ймовірно, у вас є або невідповідний сервер, або ваше з'єднання, або зламаний клієнт git. Наприклад, мережевий порт фільтрується. Подальші розслідування схожі на те, що відбувається, коли ваш пінг не відповідає :). Наприклад, ви можете спробувати перевірити, чи встановлено ви з'єднання через netcat або openssl s_client або tracepath .
они

0

TL; DR:

git ls-remote це спосіб, ось функція готова до оболонки для швидкого доступу:

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

Використання:

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

Що це робить?

Це просто зручне підмітання всіх раніше зауважень / рішень із невеликими налаштуваннями, функцією готового копіювання-вставки та зразком коду використання, щоб зробити його кристально чистим. Ви зауважите, що:

  • він обмежує вихід, оскільки перевірене посилання, ймовірно, не існує, оскільки git все-таки вийде з рівнем помилок 0 на невідповідному посиланні . Єдина відмінність тут полягає в тому, що для передачі в мережі є дещо менше результатів порівняно із HEADзапитом (і набагато менше, ніж не вимагати посилання або навіть обмеження лише головами), і це також менший вихід для передачі /dev/null(але це останній все одно займає мізерно мало часу)

  • якщо підтверджено, це дає зрозуміти, що ми намагаємося існувати , це може допомогти, якщо ви хочете бути ввічливими з адміністраторами сервера, на якому ви перевіряєте, і дати їм можливість зрозуміти, чому вони отримують ці зонди, якщо вони що-небудь контролюють.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.