git «ping»: проверьте, существует ли удаленный репозиторий

76

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

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

Есть ли лучший способ?

Джо Лисс
источник
4
Кажется, это хороший выбор. Затраты на «дополнительную работу» по извлечению и форматированию списка ссылок (которые затем отправляются /dev/null) должны быть довольно небольшими.
Крис Джонсен
Ответ должен быть: нет, лучшего способа нет.
Тимо

Ответы:

70

Я думаю, что git ls-remoteкоманда в значительной степени создана для этой цели.

Питер Айзентраут
источник
да, это похоже на работу, но не могли бы вы, пожалуйста, дать какое-то объяснение и сказать, если это 100%, что я могу клонировать это репо
vladkras
15

Если вы используете --exit-codeаргумент, вы можете пропустить отправку вывода null. Он вернет что-то только в случае ошибки.

Кроме того, вы можете использовать -hаргумент, чтобы показать только ссылки на головы.

git ls-remote --exit-code -h "$REPO_URL"
Алексей Чистопрудов
источник
-hотличная идея Тем --exit-codeне менее, это не правильный выбор здесь. Страница man говорит: Выход со статусом «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

Что это делает?

Это просто удобное сочетание всех комментариев / решений, ранее заявленных с некоторыми небольшими изменениями, функцией bash copy-paste ready и примером использования кода, чтобы сделать его кристально чистым. Вы заметите, что:

  • он ограничивает вывод как ссылка проверяется, вероятно , не существует, так как git все равно будет выход с ошибкой уровня 0 на несогласующейс исх . Единственное отличие состоит в том, что в сети немного меньше выходных данных для передачи по сравнению с запрашиваемым HEAD(и гораздо меньше, чем не требующих реф или даже ограничение только головками), и это также меньше выходных данных для преобразования /dev/null(но это последний занимает ничтожно мало времени в любом случае)

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

vaab
источник