Как проверить правильность удаленного URL-адреса репозитория git?
В bash script, что было бы самым простым способом проверить, что URL git указывает на допустимое репо git и что script имеет доступ к чтению из него?
Протоколы, которые должны поддерживаться, - это [email protected]
, https://
и git://
. Curl не работает в протоколе git://
.
[email protected]:UserName/Example.git
https://[email protected]/UserName/Example.git
git://github.com/UserName/Example.git
Примечание. Я не прошу проверить, является ли URL-адрес синтаксически правильным, мне нужно проверить, существует ли репо в URL-адресе, указанном в bash script.
Ответы
Ответ 1
Как видно из этот вопрос, вы можете использовать git ls-remote, чтобы проверить ваш адрес.
Если вам нужно отладить git вызовы set GIT_TRACE=1
. например:
env GIT_PROXY_COMMADN=myproxy.sh GIT_TRACE=1 git ls-remote https://...
"git ls-remote
" - это самый быстрый способ, с помощью которого я могу проверить связь с удаленный репозиторий, фактически не клонируя его. Следовательно, его полезность в качестве теста для этого проблема.
Вы можете видеть, что он используется для обнаружения проблемы с адресом в "git ls-remote
возвращает 128 на любое репо.
Ответ 2
Хотя ответ VonC верен, вот что я в итоге использовал:
git ls-remote будет возвращать информацию о репозитории, по умолчанию это HEAD, все ветки и теги вместе с фиксацией ID для каждой записи.
например:.
$ git ls-remote git://github.com/user/repo.git
<commit id> HEAD
<commit id> refs/heads/example_branch
<commit id> refs/heads/master
<commit id> refs/tags/v1.0.2
<commit id> refs/tags/v1.0.0
git ls-remote
возвращает код 0 при успешном завершении, код ошибки 128 при ошибке.
Если репо недоступно, например, если у вас нет разрешения на просмотр репозитория или если репозиторий не существует в этом месте, git ls-remote
вернет:
fatal: The remote end hung up unexpectedly
Чтобы использовать это в bash script, будет работать следующее:
git ls-remote "$SITE_REPO_URL" &>-
if [ "$?" -ne 0 ]; then
echo "[ERROR] Unable to read from '$SITE_REPO_URL'"
exit 1;
fi
( Примечание: &>-
отключает stderr и stdout, поэтому команда ничего не выводит)