Lors du clonage de référentiels git dans des outils automatisés - frontaux Web, systèmes CI, parfois l'invocation du clone git ouvre une invite demandant le nom d'utilisateur et le mot de passe (par exemple, lors du clonage d'un référentiel Github inexistant ou sur un nouveau nœud, les clés ssh manquent ).
Comment faire git échouer (de préférence avec un message d'erreur sensible et un code de sortie) au lieu d'attendre que le processus serveur lui donne un nom d'utilisateur et un mot de passe?
git
automation
Tin Tvrtković
la source
la source
Réponses:
Dans la version 2.3 de git, il existe une variable d'environnement
GIT_TERMINAL_PROMPT
qui, lorsqu'elle est définie sur0
, désactivera la demande d'informations d'identification.Vous pouvez obtenir plus d'informations à ce sujet dans
man git
(après la mise à jour vers la version git2.3
) ou dans cet article de blog sur github .Exemples:
git clone https://github.com/some/non-existing-repo
demandera un nom d'utilisateur et un mot de passeGIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo
échouera sans demander le nom d'utilisateur et le mot de passela source
Si vous utilisez l'authentification ssh et sous linux, vous pouvez créer un remplacement de commande ssh pour le désactiver.
Créez un fichier appelé "sshnoprompt.sh" avec:
ssh -oBatchMode=yes $@
Rendre ce fichier exécutable avec
chmod +x sshnoprompt.sh
Puis lors du démarrage de git:
GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo
Et il n'autorisera aucune invite ou question interactive git - il ne devrait pas pouvoir demander quoi que ce soit à l'utilisateur.
la source
Travailler à partir de la version 1.8.3.1 de git;
git clone -c core.askPass $echo url/or/path/to/git/repo
La configuration
core.askPass
fonctionne en passant le contrôle de la gestion des informations d'identification au programme susmentionné. Cependant, étant donné que$echo
je ne peux rien faire sauf la sortie, la tentative de clonage échoue rapidement et la redirection bash respective s'applique. Ce code est uniquement invoqué dans le cas où le référentiel git se trouve être privé, et transmet une sortie d'erreur indiquant que l'authentification a échoué pour le référentiel particulier. Vous pouvez tester cela par rapport auhttps://github.com/git/git
référentiel public par rapport à un référentiel privé que vous connaissez.Pour adoucir l'accord, vous n'auriez même pas besoin de référencer un programme comme
echo
en premier lieu. Le simple fait de passer la configuration git-c core.askPass
sans entrée suivante entraînerait toujours un échec dans le cas où le référentiel se trouve être privé car le code ne saura pas vers quel programme décharger la gestion des informations d'identification. Bien que ce soit certainement une méthode plus ancienne et plus simple que les autres mentionnées ici, je ne sais pas si elle aura le même effet dans les anciennes versions de git.la source
$echo
s'agit d'une référence de variable qui (étant non définie) se développe en chaîne vide, donc elle n'a aucun sens. Si vous y mettezecho
(sans le signe dollar), ce serait également incorrect car il serait interprété comme l'emplacement du référentiel. Il faudrait que ce soit-c core.askPass=echo
.Selon la façon dont vous exécutez git, rediriger stdin ou stdout afin qu'ils ne soient pas connectés aux terminaux empêchera git de demander des détails et provoquera simplement une erreur.
Cela vous permettrait également de signaler des erreurs (ou au moins des journaux) au service Web.
la source
</dev/null
etnohup .. &
ne semblent pas fonctionner.