git “ping”: verifique se existe repositório remoto

76

Gostaria de saber se existe um repositório remoto. Aqui está o que eu vim com:

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

Existe alguma maneira melhor?

Jo Liss
fonte
4
Parece uma boa escolha. A sobrecarga do "trabalho extra" de buscar e formatar a lista de referências (que é então enviada para /dev/null) deve ser bastante pequena.
Chris Johnsen
A resposta deve ser: Não, não há melhor maneira.
Timo

Respostas:

70

Eu acho que o git ls-remotecomando é praticamente feito para esse fim.

Peter Eisentraut
fonte
sim, isso parece funcionar, mas você pode, por favor, fornecer alguma explicação e dizer se esta 100% que eu posso clonar que repo
vladkras
15

Se você usar o --exit-codeargumento, poderá pular o envio de saída para null. Ele retornará algo apenas em caso de erro.

Além disso, você pode usar o -hargumento para mostrar apenas referências de cabeças.

git ls-remote --exit-code -h "$REPO_URL"
Oleksiy Chystoprudov
fonte
-hé uma ótima ideia No entanto, --exit-codenão é a escolha certa aqui. A página do manual diz: Saia com o status "2" quando nenhuma referência correspondente for encontrada no repositório remoto. Isso significa que git ls-remote --exit-code "$REPO_URL"haverá falha em um repositório vazio que acabou de ser inicializado git init.
Jo Liss
3

Você pode restringir a saída usando algo como git ls-remote "$REPO_URL" HEAD

ony
fonte
Pendura para sempre.
Timo
11
@Timo, provavelmente você tem um servidor que não responde ou sua conexão ou um cliente git quebrado. Por exemplo, a porta de rede é filtrada. Investigações adicionais são semelhantes ao que acontece quando o ping não responde :). Por exemplo, você pode tentar verificar se a conexão é estabelecida via netcat ou openssl s_client ou tracepath .
17488
0

TL; DR:

git ls-remote é o caminho, aqui está uma função pronta para shell para acesso rápido:

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

Uso:

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

O que isso está fazendo ?

Este é apenas um mash-up conveniente de todos os comentários / soluções mencionados anteriormente com alguns pequenos ajustes, uma função pronta para copiar e colar do bash e um exemplo de código de uso para torná-lo claro. Você notará que:

  • ele limita a saída, pois a referência verificada provavelmente não existe, pois git ainda sairá com o nível de erro 0 na referência não correspondente . A única diferença aqui é que há um pouco menos de saída a ser transferida na rede em comparação com a solicitação HEAD(e muito menos do que não pedir uma ref ou até mesmo limitar apenas as cabeças), e isso também é menos saída a ser usada /dev/null(mas isso o último está demorando um tempo insignificante)

  • o juiz verificado deixa claro que estamos investigando a existência , isso pode ajudar se você quiser ser educado com os administradores do servidor que está investigando e dar a eles a chance de entender por que eles recebem essas investigações se monitoram alguma coisa.

vaab
fonte