git clone - fehlgeschlagen, anstatt Anmeldeinformationen einzugeben

13

Beim Klonen von Git-Repositorys in automatisierten Tools - Web-Frontends, CI-Systemen, wird manchmal beim Aufrufen des Git-Klons nach Benutzername und Kennwort gefragt (z. B. beim Klonen eines nicht vorhandenen Github-Repositorys oder auf einem neuen Knoten, auf dem ssh-Schlüssel fehlen ).

Wie kann ich git einfach zum Scheitern bringen (vorzugsweise mit einer sinnvollen Fehlermeldung und einem Exit-Code), anstatt darauf zu warten, dass der Server-Prozess ihm einen Benutzernamen und ein Passwort gibt?

Tin Tvrtković
quelle
Wir haben einen Multi-Server-Jenkins eingerichtet, der nervig auf eine Aufforderung wartet, bis er beendet wird, wenn auf einem neuen Server die ssh-Schlüssel fehlen - eine Möglichkeit, zu konfigurieren, dass er mit einer Nachricht und einem Exit-Code ungleich Null einfach fehlschlägt nützlich sein.
Danny Staple
Wenn der "Batch" -Modus "catch all" verwendet werden könnte, um auch die Aufforderung zur Eingabe von Hostschlüsseln zu unterbinden, wäre dies ideal.
Danny Staple
Diese beiden sind verwandt - versuchen sie zusammenzufügen - serverfault.com/questions/61915/… , stackoverflow.com/questions/7772190/… .
Danny Staple

Antworten:

14

In Git Version 2.3 gibt es eine Umgebungsvariable, GIT_TERMINAL_PROMPTderen Einstellung 0die Aufforderung zur Eingabe von Anmeldeinformationen deaktiviert.

Weitere Informationen dazu erhalten Sie in man git(nach dem Update auf die Git-Version 2.3) oder in diesem Blog-Beitrag auf github .

Beispiele:

  • git clone https://github.com/some/non-existing-repo wird nach Benutzername und Passwort fragen
  • GIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo schlägt fehl, ohne nach Benutzername und Passwort zu fragen

quelle
Es ist frustrierend, mit einem https-git-Klon auf einem el7-Server mit git 1.8 wieder hier zu sein. Überprüfen Sie, ob ein Update auf 2.0 vom anderen Repo möglich ist.
Danny Staple
0

Wenn Sie die ssh-Authentifizierung unter Linux verwenden, können Sie einen Ersatz für den ssh-Befehl erstellen, um dies zu deaktivieren.

Erstellen Sie eine Datei mit dem Namen "sshnoprompt.sh" mit:

ssh -oBatchMode=yes $@

Machen Sie diese Datei ausführbar mit chmod +x sshnoprompt.sh

Dann beim Start von git:

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

Und es werden keine interaktiven Git-Eingabeaufforderungen oder Fragen zugelassen - es sollte nicht möglich sein, den Benutzer nach irgendetwas zu fragen.

Danny Staple
quelle
0

Ab Git-Version 1.8.3.1 arbeiten;

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

Bei der Konfiguration core.askPasswird die Kontrolle über die Bearbeitung der Anmeldeinformationen an das oben genannte Programm übergeben. Da $echojedoch nur die Ausgabe möglich ist, schlägt der Klonversuch sofort fehl und die entsprechende Bash-Umleitung wird angewendet. Dieser Code wird nur für den Fall aufgerufen, dass das Git-Repository privat ist, und gibt eine Pipe-Fehlermeldung aus, die besagt, dass die Authentifizierung für das jeweilige Repository fehlgeschlagen ist. Sie können dies mit dem https://github.com/git/gitöffentlichen Repository gegen ein Ihnen bekanntes privates Repository testen .

Um den Deal zu versüßen, müssten Sie nicht einmal auf ein Programm wie echodas erste verweisen . Die einfache Übergabe der Git-Konfiguration -c core.askPassohne nachfolgende Eingabe würde dennoch zu einem Fehler führen, falls das Repository privat ist, da der Code nicht weiß, in welches Programm die Verarbeitung von Anmeldeinformationen verlagert werden soll. Dies ist sicherlich eine ältere und einfachere Methode als die anderen hier genannten, aber ich weiß nicht, ob sie in älteren Versionen von Git den gleichen Effekt haben wird.

Jouster500
quelle
Sie haben ein wenig Recht, wenn Sie sich sehr irren. In Ihrem Fall $echohandelt es sich in erster Linie um eine Variablenreferenz, die (wenn sie nicht gesetzt ist) zu einer leeren Zeichenfolge erweitert wird und daher völlig bedeutungslos ist. Wenn Sie echodort (ohne das Dollarzeichen) eingeben, ist dies ebenfalls falsch, da es als Speicherort interpretiert wird. Es müsste sein -c core.askPass=echo.
Michał Górny
-1

Je nachdem, wie Sie git ausführen, wird durch Umleiten von stdin oder stdout, so dass sie nicht mit Terminals verbunden sind, die Aufforderung zur Eingabe von Details durch git beendet und lediglich ein Fehler verursacht.

Auf diese Weise können Sie auch Fehler (oder zumindest Protokolle) im Webservice anzeigen.

Matthew Steeples
quelle
Wie genau würde ich das machen? Der Versuch , diese zunächst in Bash zu erreichen, beide </dev/nullund nohup .. &scheint nicht zu arbeiten.
Tin Tvrtković
Diese Antwort ist ohne ein bestimmtes Beispiel, wie dies erreicht werden kann, nicht hilfreich. Vor allem, dass die "offensichtlichen" Methoden, wie oben erwähnt, nicht funktionieren.
Michał Górny
@ MichałGórny Ich hatte die OPs-Frage vor ein paar Jahren nicht gesehen, aber die Frage (Betriebssystem, Toolset) enthielt nicht genügend Informationen, um darauf antworten zu können. Stdin und stdout umleiten. Git hat sich seit dem Stellen der Frage stark verändert (unter Windows werden beispielsweise externe Dialogfelder für Anmeldeinformationen angezeigt, wenn Sie eine Verbindung zu Azure DevOps herstellen), sodass Sie die in der oberen Antwort aufgeführte Umgebungsvariable verwenden sollten
Matthew Steeples