git "ping": comprueba si existe un repositorio remoto

75

Me gustaría saber si existe un repositorio remoto. Esto es lo que se me ocurrió:

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

¿Hay alguna forma mejor?

Jo Liss
fuente
44
Parece una buena elección. La sobrecarga del "trabajo adicional" de buscar y formatear la lista de referencias (que luego se envía a /dev/null) debe ser bastante pequeña.
Chris Johnsen
La respuesta debería ser: No, no hay mejor manera.
Timo

Respuestas:

70

Creo que el git ls-remotecomando está hecho para ese propósito.

Peter Eisentraut
fuente
Sí, esto parece funcionar, pero puede usted, por favor, dar algunas explicaciones y decir si esta 100% que puedo clonar que repo
vladkras
15

Si usa --exit-codeargumentos, puede omitir el envío de resultados null. Solo devolverá algo en caso de error.

Además, puede usar -hargumentos para mostrar solo referencias de cabezas.

git ls-remote --exit-code -h "$REPO_URL"
Oleksiy Chystoprudov
fuente
-hEs una gran idea. Sin embargo, --exit-codeno es la elección correcta aquí. La página de manual dice: Salga con el estado "2" cuando no se encuentren referencias coincidentes en el repositorio remoto. Esto significa que git ls-remote --exit-code "$REPO_URL"fallará para un repositorio vacío que se acaba de inicializar git init.
Jo Liss
3

Puede reducir la producción utilizando algo como git ls-remote "$REPO_URL" HEAD

ony
fuente
Se cuelga para siempre.
Timo
1
@Timo, entonces probablemente tengas un servidor que no responde o tu conexión o un cliente git roto. Por ejemplo, se filtra el puerto de red. Las investigaciones adicionales son algo similares a lo que sucede cuando su ping no responde :). Por ejemplo, puede intentar comprobar si se establece la conexión a través de netcat o openssl s_client o tracepath .
ony
0

TL; DR:

git ls-remote es el camino, aquí hay una función lista para shell para acceso 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

Qué está haciendo ?

Esto es solo una combinación conveniente de todos los comentarios / soluciones previamente establecidos con algunos pequeños ajustes, una función de listo para copiar y pegar bash y una muestra de código de uso para que quede claro como el cristal. Notarás que:

  • limita la salida ya que la referencia marcada es probablemente inexistente, ya git que todavía saldrá con el nivel de error 0 en la referencia no coincidente . La única diferencia aquí es que hay un poco menos de salida para transferir en la red en comparación con la solicitud HEAD(y mucho menos que no pedir una referencia o incluso limitarla solo a cabezas), y esto también es menos salida para emitir /dev/null(pero esto el último está tomando un tiempo insignificante de todos modos)

  • la referencia verificada deja en claro que estamos investigando la existencia , esto podría ayudar si desea ser cortés con los administradores del servidor que está investigando y darles la oportunidad de comprender por qué reciben estas sondas si supervisan algo.

vaab
fuente