clone git - fallisce invece di richiedere credenziali


14

Quando si clonano repository git in strumenti automatizzati - front-end Web, sistemi CI, a volte l'invocazione del clone git apre un prompt che richiede il nome utente e la password (ad esempio, quando si clona un repository Github inesistente o su un nuovo nodo mancante di chiavi ssh ).

Come faccio a far fallire git (preferibilmente con un messaggio di errore sensibile e un codice di uscita) invece di attendere che il processo del server gli dia un nome utente e una password?


Abbiamo un Jenkins multi-server installato, che rimane fastidiosamente in attesa di un prompt fino a quando non viene ucciso se viene eseguito su un nuovo server privo delle chiavi ssh - un modo per configurare che fallirà semplicemente con un messaggio e un codice di uscita diverso da zero sarebbe essere utile.
Danny Staple,

Se fosse possibile utilizzare una modalità "batch" di cattura per impedire anche la richiesta di chiavi host, questo sarebbe l'ideale.
Danny Staple,

Entrambi sono correlati - cercando di metterli insieme - serverfault.com/questions/61915/… , stackoverflow.com/questions/7772190/… .
Danny Staple,

Risposte:


15

In git versione 2.3 c'è una variabile d'ambiente GIT_TERMINAL_PROMPTche, se impostata su 0, disabiliterà la richiesta di credenziali.

Puoi ottenere maggiori informazioni a riguardo man git(dopo l'aggiornamento alla versione git 2.3) o in questo post del blog su github .

Esempi:

  • git clone https://github.com/some/non-existing-repo richiederà nome utente e password
  • GIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo fallirà senza richiedere username e password

Frustrante tornare qui con un clone https git, su un server el7 con git 1.8. Andare a verificare se l'aggiornamento a 2.0 dall'altro repository è un'opzione per questo.
Danny Staple,

0

Se si utilizza l'autenticazione ssh e su Linux, è possibile creare una sostituzione del comando ssh per disabilitarla.

Crea un file chiamato "sshnoprompt.sh" con:

ssh -oBatchMode=yes $@

Rendi eseguibile questo file con chmod +x sshnoprompt.sh

Quindi quando si avvia git:

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

E non consentirà alcun suggerimento o domanda git interattiva - non dovrebbe essere in grado di chiedere all'utente nulla.


0

Funzionando dalla versione 1.8.3.1 di git;

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

La configurazione core.askPassfunziona passando il controllo della gestione delle credenziali al suddetto programma. Tuttavia, poiché $echonon è possibile eseguire alcuna operazione tranne l'output, il tentativo di clonazione fallisce prontamente e si applica il relativo reindirizzamento bash. Questo codice viene invocato solo nel caso in cui il repository git sia privato e invierà un messaggio di errore indicando che l'autenticazione non è riuscita per il repository specifico. È possibile verificarlo con il https://github.com/git/gitrepository pubblico con un repository privato di cui si è a conoscenza.

Per addolcire l'affare, non è nemmeno necessario fare riferimento a un programma come echoin primo luogo. Il semplice passaggio alla configurazione di git -c core.askPasssenza input di seguito causerebbe comunque un errore nel caso in cui il repository fosse privato in quanto il codice non saprà a quale programma scaricare la gestione delle credenziali. Anche se questo è certamente un metodo più vecchio e più semplice rispetto agli altri qui menzionati, non so se avrà lo stesso effetto nelle versioni precedenti di git.


Sei in qualche modo corretto pur avendo torto. Prima di tutto, nel tuo caso $echoè un riferimento variabile che (essendo non impostato) si espande in una stringa vuota, quindi è del tutto insignificante. Se si inserisce echolì (senza il simbolo del dollaro), sarebbe anche errato poiché sarebbe interpretato come posizione del repository. Dovrebbe essere -c core.askPass=echo.
Michał Górny,

-1

A seconda di come stai eseguendo git, il reindirizzamento di stdin o stdout in modo che non siano collegati ai terminali impedirà a git di richiedere dettagli e causare errori.

Ciò consentirebbe anche di far emergere errori (o almeno registri) nel servizio web.


Come farei esattamente a fare questo? Cercando di farlo prima in Bash, entrambi </dev/nulle nohup .. &non sembrano funzionare.
Tin Tvrtković,

Questa risposta non è utile senza un esempio specifico su come raggiungere questo obiettivo. Soprattutto che i metodi "ovvi" non funzionano, come menzionato sopra.
Michał Górny,

@ MichałGórny Non vedevo la domanda dei PO da qualche anno, ma non c'erano abbastanza informazioni nella domanda (OS, Toolset) per poter rispondere. Reindirizzamento di stdin e stdout. Git è cambiato molto da quando è stata posta la domanda (su Windows, ad esempio, apre finestre di dialogo esterne per le credenziali se ci si connette ad Azure DevOps), quindi è meglio usare la variabile di ambiente elencata nella risposta principale
Matthew Steeples
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.