Cygwin / Git Bizarre Terminal Issue


16

Va bene, questo è strano. Prima di tutto, questo è perfetto per il cygwin aggiornato, con git estratto dal setup.exe di cygwin. Sto correndo 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>

Cosa sta succedendo qui? È un problema terminale, un problema shell, un problema git o un problema cygwin?

Aggiornamento: Sì, sto eseguendo la versione git di Cygwin, non la versione di Windows:

$ 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

1
Sto indovinando un problema terminale. Il fatto che la tua password appaia suggerisce che il terminale non viene correttamente messo in modalità silenziosa (dove non mostra i caratteri digitati), e il fatto che il testo della password appaia di nuovo dopo che hai premuto ^Csuggerisce che i caratteri non sono " t viene inviato a stdin del processo git. Ma non so quale potrebbe essere il problema specifico.
David Z,

Grazie per l'indizio: mi sono imbattuto in questo: code.google.com/p/mintty/issues/detail?id=56 - ma non c'è modo di mettere git in modalità interattiva come l'eseguibile python ...
emptyset

1
Sei sicuro di invocare la versione di Cygwin di git? Il delicato numero 56 si applica solo ai programmi Windows nativi.
ak2,

Hai trovato una soluzione a questo problema?
pauldoo,

Risposte:


9

OK, penso di aver trovato una soluzione definitiva.

Il problema è che, indipendentemente dal terminale utilizzato (puttycyg, mintty, cmd.exe), Git di default, in assenza di alternative meglio configurate, tenta di utilizzare un "semplice prompt di password" (come puoi leggere nella descrizione di core.askpass opzione di configurazione ).

Apparentemente il semplice prompt della password funziona solo su UNIX reale, ma non su Cygwin.

La soluzione è installare un programma compatibile SSH_ASKPASS per Windows e configurare Git per usarlo.

Quello che ho fatto è stato:

  1. Installa l'applicazione win-ssh-askpass scompattando e copiando in C: \
  2. Scarica e installa il runtime di Borland Delphi 5 richiesto da win-ssh-askpass (difficile da trovare al giorno d'oggi, ma ne trovi uno su http://www.satsignal.eu/software/runtime.html )
  3. Configurare Git per ottenere password utilizzando win-ssh-askpass: git config --global core.askpass "C:/win_ssh_askpass.exe". Si noti che il file EXE ha caratteri di sottolineatura nel nome, non segni meno.
  4. Ricorda di inserire sempre il tuo login nell'URL ( https://<user>@<domain>/<repository>). Altrimenti, Git chiederà il login prima di chiedere la password, usando la stessa utility askpass. È possibile inserire inconsapevolmente la password come login, che verrà inviata al webserwer e registrata nel suo registro di accesso come testo normale!

Ora Git richiede la password utilizzando un'elegante finestra della GUI e funziona indipendentemente dal terminale utilizzato :)


grazie, corri in modo casuale, ma corre :) Non so perché git non funzioni come previsto. sovversione lo fa bene.
Correggere il

1
Ho appena eseguito il seguente e si apre una GUI: git config --global core.askpass clone "git-gui - askpass"
Derek Greer

7

Ho riscontrato lo stesso problema, tuttavia nel mio caso sono SSH nel server Cygwin, quindi ovviamente un askpass GUI Win32 non funzionerà.

Invece, ho scritto questo semplice script per fare askpass. Ho pensato che potesse essere utilizzato anche dai normali prompt ottenendo il dispositivo tty da /bin/tty.exema che non funzionava per un motivo sconosciuto (sentiti libero di tty te stesso o cerca un'altra soluzione per ottenere il tty, forse ho sbagliato in qualche modo ).

/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

Assicurati che questo script sia eseguibile e usalo come impostazione core.askpass di git. Poiché questo script si basa sulla variabile $ SSH_TTY normalmente funzionerà solo da SSH. Tuttavia, è possibile impostare $ SSH_TTY in .bashrco .bash_profilese non impostato; in questo modo dovrebbe funzionare anche da console. La seguente riga nel tuo script rc dovrebbe farlo:

[ -z "$SSH_TTY" ] && export SSH_TTY=$(/bin/tty.exe)

Posso confermare questa soluzione, funziona molto bene.
schlamar,

Questo ha funzionato abbastanza bene anche per me. Tuttavia, ho dovuto aggiungere un reindirizzamento (1> & 2) su quel messaggio "Impossibile aprire ..." per renderlo visibile.
Eric

2

le soluzioni sopra non funzionano per me, ma ne ho trovata un'altra.

devi eseguire l'agente ssh

basta aggiungere a ~ / .bashrc e riavviare la console

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 e Opera usano l'interruzione di linea che non è compatibile con bash: basta usare un altro browser per copiare e incollare


1

È possibile che tu abbia un metacarattere, ad esempio &, nell'URL. Ciò farebbe funzionare git in background e su un sistema Unix verrebbe fermato non appena provasse a leggere da stdin. A ;terminerebbe anche parzialmente il comando attraverso la linea e Ctrl-Ccauserebbe l' interruzione del resto della linea (un comando separato).

È interessante che gitinizializzi il repository /cygdrive/c/src/project/dev/.git/anche se gli hai detto di usarlo~/src/project/dev (a meno che tu non abbia la tua home directory in un posto strano). Ciò suggerirebbe che il gitcomando non sta vedendo il resto della riga di comando, che è ciò che accadrebbe se ci fosse un randagio &o ;nell'URL.

(Ho avuto questo problema molte volte con wget , anche se non con git.)

Provare a git cloneda un repository diverso o utilizzare un trasporto diverso dallo stesso repository per vedere se gitè incasinato in generale o solo per questo repository. Puoi anche provare a mettere virgolette singole attorno all'URL.


~/srcè un link simbolico a /cygdrive/c/src( C:\src). Non c'è &nell'URL. Proverò a clonare un repository git pubblico, ma generalmente quelli non avranno una password ...
emptyset

1

Dai un'occhiata al seguente problema: ora sono abbastanza certo che è solo una limitazione della zecca e dell'interoperabilità con Windows.

Numero 56 - come nuovo

Ho anche avuto problemi a eseguire mysql e così da mintty, quindi la risposta è che si tratta di un problema di emulazione terminale.


1

Alla domanda è già stata data una risposta ... Vorrei solo aggiungere come ho risolto:

Controllando Windows Git Bash, ho potuto vedere il gitseguente setSSH_ASKPASS

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

Quindi, su Cygwin, ho aggiunto la stessa variabile a .bashrc

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

o

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

In questo modo, git apre SSH_ASKPASS da Git ... Non ho dovuto installare alcun SW aggiuntivo o creare uno script aggiuntivo.

Spero che questo possa aiutare!


0

Anni fa ricordo di avere avuto dei problemi con l'autenticazione CVS di Cygwin ... aveva a che fare con il fatto che Cygwin fosse installato con le terminazioni di linea in stile DOS o Unix (CRLF contro solo LF); è una delle opzioni nella finestra di dialogo dell'installer. Se scegliessi quello sbagliato (penso che DOS fosse quello che ha funzionato) la password sarebbe finita con un carattere spurio o qualcosa del genere.

Ad ogni modo, potrebbe valere la pena provare l'altra opzione.


0

Ho lo stesso problema, e, al contrario di questa discussione , il problema si verifica con Cygwin GIT in tutti i terminali possibili - puttycyg, minttye il classico di Windowscmd.exe .

Sto ancora cercando una soluzione adeguata, ma c'è una soluzione alternativa - anche se è molto insicura, puoi provare a inserire la password nell'URL del repository, ad esempio:

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

La soluzione alternativa funziona per te?


0

Se è un repository che usi spesso, la cosa più semplice potrebbe essere quella di creare un file ~ / .netrc con

machine git.example.com
login yourlogin
password your password

Ovviamente, dovresti impostare autorizzazioni draconiane sul file.


Perché non usare solo ssh come trasporto?
vonbrand,

0

Solo un perfezionamento sul commento n. 2

C'è un cygwin ssh-ask-pass (non ufficiale) qui

Basta scaricare tar.bz2 e decomprimerlo nella cartella cygwin. Funziona senza installare Borland Delphi Runtime.

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.