git clone: ​​falla en lugar de solicitar credenciales

14

Al clonar repositorios git en herramientas automatizadas: front-end web, sistemas CI, a veces la invocación git clone abre un mensaje que solicita el nombre de usuario y la contraseña (por ejemplo, al clonar un repositorio Github inexistente o en un nuevo nodo que no tiene claves ssh) )

¿Cómo hago que git simplemente falle (preferiblemente con un mensaje de error sensible y un código de salida) en lugar de esperar a que el proceso del servidor le dé un nombre de usuario y contraseña?

Tin Tvrtković
fuente
Tenemos una configuración de Jenkins multiservidor, que molestamente se sienta esperando un aviso hasta que se elimine si se ejecuta en un nuevo servidor que falta las claves ssh, una forma de configurar que simplemente fallará con un mensaje y un código de salida distinto de cero sé útil.
Danny Staple
Si un modo de capturar todo el "lote" pudiera usarse para no permitir la solicitud de claves de host también, esto sería ideal.
Danny Staple
Ambos están relacionados, tratando de unirlos: serverfault.com/questions/61915/… , stackoverflow.com/questions/7772190/… .
Danny Staple

Respuestas:

15

En git versión 2.3 hay una variable de entorno GIT_TERMINAL_PROMPTque cuando se configura 0deshabilitará la solicitud de credenciales.

Puede obtener más información al respecto en man git(después de actualizar a la versión de git 2.3) o en esta publicación de blog en github .

Ejemplos:

  • git clone https://github.com/some/non-existing-repo le pedirá nombre de usuario y contraseña
  • GIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo fallará sin solicitar nombre de usuario y contraseña

fuente
Frustrante estar de vuelta aquí con un https git clone, en un servidor el7 con git 1.8. Comprobar si actualizar a 2.0 desde el otro repositorio es una opción para ello.
Danny Staple el
0

Si está utilizando la autenticación ssh y en Linux, puede crear un reemplazo del comando ssh para deshabilitarlo.

Cree un archivo llamado "sshnoprompt.sh" con:

ssh -oBatchMode=yes $@

Haga que este archivo sea ejecutable con chmod +x sshnoprompt.sh

Luego, al comenzar git:

GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo

Y no permitirá preguntas o preguntas interactivas sobre git, no debería poder pedirle nada al usuario.

Danny Staple
fuente
0

Trabajando desde git versión 1.8.3.1;

git clone -c core.askPass $echo url/or/path/to/git/repo

La configuración core.askPassfunciona pasando el control de manejo de credenciales al programa antes mencionado. Sin embargo, dado que $echono puede hacer nada excepto la salida, el intento de clonación falla rápidamente y se aplica la respectiva redirección de bash. Este código solo se invoca en el caso de que el repositorio de git sea privado y canalizará la salida de error que indica que la autenticación falló para el repositorio en particular. Puede probar esto en el https://github.com/git/gitrepositorio público en un repositorio privado que conozca.

Para endulzar el trato, ni siquiera necesitaría hacer referencia a un programa como echoen primer lugar. Simplemente pasar la configuración de git -c core.askPasssin la siguiente entrada aún causaría un error en el caso de que el repositorio sea privado ya que el código no sabrá a qué programa descargar el manejo de credenciales. Si bien este es ciertamente un método más antiguo y simple que los otros mencionados aquí, no sé si tendrá el mismo efecto en versiones anteriores de git.

Jouster500
fuente
Estás algo correcto mientras estás muy equivocado. En primer lugar, en su caso $echoes una referencia variable que (al estar desarmado) se expande a una cadena vacía, por lo que no tiene ningún sentido. Si coloca echoallí (sin el signo de dólar), también sería incorrecto ya que se interpretaría como ubicación del repositorio. Tendría que ser así -c core.askPass=echo.
Michał Górny
-1

Dependiendo de cómo esté ejecutando git, redirigir stdin o stdout para que no estén conectados a los terminales evitará que git solicite detalles y solo provocará un error.

Esto también le permitiría mostrar errores (o al menos registros) en el servicio web.

Matthew Steeples
fuente
¿Cómo exactamente haría esto? Intentando lograr esto en Bash primero, ambos </dev/nully nohup .. &no parecen funcionar.
Tin Tvrtković
Esta respuesta no es útil sin un ejemplo específico de cómo lograr esto. Especialmente que los métodos 'obvios' no funcionan, como se mencionó anteriormente.
Michał Górny
@ MichałGórny No había visto la pregunta de OP hace unos años, pero no había suficiente información en la pregunta (SO, Toolset) para poder responderla. Redireccionando stdin y stdout. Git ha cambiado mucho desde que se hizo la pregunta (en Windows, por ejemplo, aparece cuadros de diálogo externos para credenciales si se está conectando a Azure DevOps), por lo que es mejor usar la variable de entorno que figura en la respuesta principal
Matthew Steeples