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?
git
automation
Tin Tvrtković
quelle
quelle
Antworten:
In Git Version 2.3 gibt es eine Umgebungsvariable,
GIT_TERMINAL_PROMPT
deren Einstellung0
die Aufforderung zur Eingabe von Anmeldeinformationen deaktiviert.Weitere Informationen dazu erhalten Sie in
man git
(nach dem Update auf die Git-Version2.3
) oder in diesem Blog-Beitrag auf github .Beispiele:
git clone https://github.com/some/non-existing-repo
wird nach Benutzername und Passwort fragenGIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo
schlägt fehl, ohne nach Benutzername und Passwort zu fragenquelle
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.
quelle
Ab Git-Version 1.8.3.1 arbeiten;
git clone -c core.askPass $echo url/or/path/to/git/repo
Bei der Konfiguration
core.askPass
wird die Kontrolle über die Bearbeitung der Anmeldeinformationen an das oben genannte Programm übergeben. Da$echo
jedoch 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 demhttps://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
echo
das erste verweisen . Die einfache Übergabe der Git-Konfiguration-c core.askPass
ohne 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.quelle
$echo
handelt 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 Sieecho
dort (ohne das Dollarzeichen) eingeben, ist dies ebenfalls falsch, da es als Speicherort interpretiert wird. Es müsste sein-c core.askPass=echo
.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.
quelle
</dev/null
undnohup .. &
scheint nicht zu arbeiten.