Cygwin / Git Bizarre Terminal Issue

16

Okay, das ist komisch. Zunächst einmal ist dies Mintty, das auf aktuellem Cygwin ausgeführt wird, wobei der Git aus Cygwins setup.exe gezogen wird. Ich laufe zsh.

$ git clone https://<user>@<domain>/<repository>/ ~/src/project/dev
Initialized empty Git repository in /cygdrive/c/src/project/dev/.git/
Password: <actual password in plain text appears>
# Nothing happens...
^C
$ <password text that I just typed>
zsh: command not found: <same password text>

Was geht hier vor sich? Handelt es sich um ein Terminalproblem, ein Shellproblem, ein Git-Problem oder ein Cygwin-Problem?

Update: Ja, ich verwende die Cygwin-Git-Version, nicht die Windows-Version:

$ which git
/usr/bin/git
$ git --version
git version 1.7.1
$ /cygdrive/c/Program\ Files\ \(x86\)/Git/bin/git.exe --version
git version 1.7.0.2.msysgit.0
leeres Set
quelle
1
Ich vermute ein Terminalproblem. Die Tatsache, dass Ihr Kennwort angezeigt wird, deutet darauf hin, dass das Terminal nicht ordnungsgemäß in den unbeaufsichtigten Modus versetzt wird (in dem die von Ihnen ^Ceingegebenen Zeichen nicht angezeigt werden). t immer auf stdin des Git-Prozesses gesendet. Aber ich weiß nicht, was das spezifische Problem sein könnte.
David Z
Vielen Dank für den Hinweis - ich bin auf Folgendes gestoßen : code.google.com/p/mintty/issues/detail?id=56 - aber es gibt keine Möglichkeit, Git in einen interaktiven Modus wie die ausführbare Python-Datei zu versetzen ...
emptyset
1
Sind Sie sicher, dass Sie Cygwins Version von git aufrufen? Das Mintty-Problem 56 betrifft nur native Windows-Programme.
Ak2
Haben Sie eine Lösung für dieses Problem gefunden?
Pauldoo

Antworten:

9

OK, ich denke ich habe eine definitive Lösung gefunden.

Das Problem ist, dass Git unabhängig vom verwendeten Terminal (puttycyg, mintty, cmd.exe) standardmäßig versucht, eine "einfache Passwortabfrage" zu verwenden (wie Sie in der Beschreibung von lesen können), da es keine besser konfigurierten Alternativen gibt core.askpass Konfigurationsoption ).

Die einfache Passwortabfrage funktioniert anscheinend nur unter echtem UNIX, nicht aber unter Cygwin.

Die Lösung besteht darin, ein SSH_ASKPASS-kompatibles Programm für Windows zu installieren und Git für die Verwendung zu konfigurieren.

Was ich getan habe war:

  1. Installieren Sie die Anwendung win-ssh-askpass , indem Sie sie entpacken und nach C: \ kopieren.
  2. Laden Sie die für win-ssh-askpass erforderliche Borland Delphi 5-Laufzeit herunter und installieren Sie sie (derzeit nur schwer zu bekommen, finden Sie sie jedoch unter http://www.satsignal.eu/software/runtime.html ).
  3. Konfigurieren Git erhalten Passwörter Win-ssh-askpass mit: git config --global core.askpass "C:/win_ssh_askpass.exe". Beachten Sie, dass die EXE-Datei im Namen Unterstriche und keine Minuszeichen enthält.
  4. Denken Sie daran, immer Ihre Login in der URL zu platzieren ( https://<user>@<domain>/<repository>). Andernfalls fragt Git nach dem Login, bevor Sie nach dem Passwort fragen. Verwenden Sie dazu dasselbe askpass-Dienstprogramm. Möglicherweise geben Sie Ihr Passwort unwissentlich als Login ein, das an den Webserver gesendet und in dessen Zugriffsprotokoll als Klartext protokolliert wird!

Jetzt fragt Git in einem eleganten GUI-Fenster nach dem Passwort und funktioniert unabhängig vom verwendeten Terminal :)

Aleksander Adamowski
quelle
Danke, laufe nach dem Zufallsprinzip, aber laufe :) Ich weiß nicht, warum git nicht wie erwartet läuft. Subversion macht es gut.
Corretge
1
Ich habe gerade folgendes ausgeführt und es erscheint eine GUI: git config --global core.askpass "git-gui - askpass" Klon
Derek Greer
7

Ich habe das gleiche Problem festgestellt - in meinem Fall wurde jedoch SSH auf dem Cygwin-Server ausgeführt, sodass ein Win32-GUI-Askpass offensichtlich nicht funktioniert.

Stattdessen habe ich dieses einfache Skript für den Askpass geschrieben. Ich dachte, es könnte auch von normalen Eingabeaufforderungen aus verwendet werden, indem man das tty-Gerät abruft, /bin/tty.exeaber das hat aus einem unbekannten Grund nicht funktioniert (zögern Sie nicht, sich zu ttyen oder suchen Sie nach einer anderen Lösung, um das tty zu bekommen, vielleicht habe ich es einfach irgendwie falsch verstanden ).

/bin/askpass.sh:

#!/bin/bash

TTY=$SSH_TTY
[ -c "$TTY" -a -r "$TTY" -a -w "$TTY" ] \
  || { echo "Failed to open device \`$TTY'!"; exit 1; }
exec <$TTY

echo -n "$@" >$TTY
read -s P
echo >$TTY

echo $P

Stellen Sie sicher, dass dieses Skript ausführbar ist, und verwenden Sie es als core.askpass-Einstellung Ihres Git. Da dieses Skript auf der Variablen $ SSH_TTY basiert, funktioniert es normalerweise nur mit SSH. Sie können jedoch $ SSH_TTY ein- .bashrcoder ausschalten .bash_profile; Auf diese Weise sollte es auch von einer Konsole aus funktionieren. Die folgende Zeile in Ihrem RC-Skript sollte dies tun:

[ -z "$SSH_TTY" ] && export SSH_TTY=$(/bin/tty.exe)
Thomas Guyot-Sionnest
quelle
Ich kann diese Lösung bestätigen, funktioniert sehr gut.
Schlamar
Das hat auch bei mir ganz gut geklappt. Ich musste jedoch eine Umleitung (1> & 2) zu der Meldung "Öffnen fehlgeschlagen ..." hinzufügen, damit sie angezeigt wird.
Eric
2

Die oben genannten Lösungen funktionieren bei mir nicht, aber ich habe eine andere gefunden.

Sie müssen ssh agent ausführen

fügen Sie einfach ~ / .bashrc hinzu und starten Sie die Konsole neu

SSH_ENV=$HOME/.ssh/environment



# start the ssh-agent

function start_agent {

    echo "Initializing new SSH agent..."

    # spawn ssh-agent

    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"

    echo succeeded

    chmod 600 "${SSH_ENV}"

    . "${SSH_ENV}" > /dev/null

    /usr/bin/ssh-add

}



if [ -f "${SSH_ENV}" ]; then

     . "${SSH_ENV}" > /dev/null

     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {

        start_agent;

    }

else

    start_agent;

fi

PS Chrome und Opera verwenden einen Zeilenumbruch, der nicht mit Bash kompatibel ist. Verwenden Sie einfach einen anderen Browser zum Kopieren und Einfügen

Aloy
quelle
1

Möglicherweise enthält &die URL ein Metazeichen, z. B.. Dies würde dazu führen, dass git im Hintergrund ausgeführt wird und auf einem Unix-System gestoppt wird, sobald versucht wird, von stdin zu lesen. A ;würde auch den Befehl auf halbem Weg durch die Zeile beenden und den Ctrl-CRest der Zeile (einen separaten Befehl) abbrechen.

Es ist interessant, dass gitdas Repo initialisiert wird /cygdrive/c/src/project/dev/.git/, obwohl Sie es angewiesen haben ~/src/project/dev(es sei denn, Sie haben Ihr Home-Verzeichnis an einem fremden Ort). Dies würde bedeuten, dass der gitBefehl den Rest der Befehlszeile nicht sieht, was passieren würde, wenn ein Streuner &oder eine ;URL vorhanden wäre.

(Ich hatte dieses Problem oft mit wget, obwohl nicht mit git.)

Probieren Sie ein git cloneaus einem anderen Repo oder verwenden Sie ein anderes Transportmittel aus demselben Repo, um festzustellen, ob das Repo gitgenerell oder nur für dieses Repo fehlerhaft ist. Sie können auch versuchen, die URL in einfache Anführungszeichen zu setzen.

Neil Mayhew
quelle
~/srcist ein Symlink zu /cygdrive/c/src( C:\src). Die &URL enthält kein . Ich werde versuchen, ein öffentliches Git-Repository zu klonen, aber im Allgemeinen haben diese kein Passwort ...
Leerset
1

Schauen Sie sich das folgende Problem an - ich bin mir ziemlich sicher, dass es nur eine Einschränkung der Minz- und Interoperabilität mit Windows ist.

Ausgabe 56 - Mintty

Ich hatte auch Probleme mit der Ausführung von MySQL und anderen Programmen von mintty - die Antwort lautet also, dass es sich um ein Terminal-Emulationsproblem handelt.

leeres Set
quelle
1

Die Frage wurde bereits beantwortet ... Ich möchte nur hinzufügen, wie ich es behoben habe:

Beim Überprüfen von Windows Git Bashkonnte ich das gitfolgende Set sehenSSH_ASKPASS

$ echo $SSH_ASKPASS
/mingw64/libexec/git-core/git-gui--askpass

Auf Cygwin habe ich also dieselbe Variable hinzugefügt .bashrc

# Unconditionally export SSH_ASKPASS
export SSH_ASKPASS="/mingw64/libexec/git-core/git-gui--askpass"

oder

# export SSH_ASKPASS only if git is installed
hash git 2>/dev/null && export SSH_ASKPASS="/mingw64/libexec/git-core/git-gui--askpass"

Dabei öffnet Git den SSH_ASKPASS von Git ... Ich musste keine zusätzliche Software installieren oder ein zusätzliches Skript erstellen.

Hoffe das kann helfen!

W0rmH0le
quelle
0

Ich erinnere mich, dass ich vor Jahren einige Probleme mit der CVS-Authentifizierung von Cygwin hatte. Dies hing damit zusammen, ob Sie Cygwin mit den Zeilenenden im DOS- oder Unix-Stil (CRLF im Vergleich zu nur LF) installiert haben. Dies ist eine der Optionen im Installationsdialog. Wenn Sie das falsche Passwort auswählen (ich denke, DOS hat funktioniert), wird das Passwort unleserlich oder hat ein falsches Zeichen oder ähnliches.

Auf jeden Fall könnte es sich lohnen, die andere Option auszuprobieren.

timday
quelle
0

Ich habe das gleiche Problem, und, im Gegensatz zu diesem Thread , tritt das Problem mit Cygwin GIT in allen möglichen Terminals - puttycyg, minttyund die klassischen Windows - cmd.exe.

Ich bin immer noch auf der Suche nach einer geeigneten Lösung, aber es gibt eine Problemumgehung - obwohl dies sehr unsicher ist, können Sie versuchen, das Passwort in die URL des Repositorys zu schreiben, z.

git clone https://<user>:<password>@<domain>/<repository>/

Funktioniert die Problemumgehung für Sie?

Aleksander Adamowski
quelle
0

Wenn es sich um ein Repository handelt, das Sie häufig verwenden, ist es möglicherweise am einfachsten, eine ~ / .netrc-Datei mit zu erstellen

machine git.example.com
login yourlogin
password your password

Natürlich sollten Sie die drakonischen Berechtigungen für die Datei entsprechend festlegen.

Carson Chittom
quelle
Warum nicht einfach ssh als Transportmittel verwenden?
Vonbrand
0

Nur eine Verfeinerung zu Kommentar 2

Es gibt einen cygwin ssh-ask-Pass (inoffizielle) hier

Laden Sie einfach die Datei tar.bz2 herunter und entpacken Sie sie in Ihren Cygwin-Ordner. Es funktioniert ohne borland delphi runtime zu installieren.

Raghu
quelle