Edição bizarra do terminal Cygwin / Git


16

Tudo bem, isso é estranho. Primeiro, é uma execução simples no cygwin atualizado, com o git retirado do setup.exe do cygwin. Estou executando o 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>

O que está acontecendo aqui? Esse é um problema terminal, um problema de shell, um problema de git ou um problema de cygwin?

Atualização: Sim, estou executando a versão git do Cygwin, não a versão do 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
Estou supondo um problema terminal. O fato de sua senha aparecer sugere que o terminal não está sendo colocado corretamente no modo silencioso (onde não mostra os caracteres digitados) e o fato de o texto da senha aparecer novamente depois que você pressiona ^Csugere que os caracteres não estão ' sendo enviado para o stdin do processo git. Mas não sei qual pode ser o problema específico.
David Z

Obrigado pela pista - me deparei com isso: code.google.com/p/mintty/issues/detail?id=56 - mas não há como colocar o git no modo interativo como o executável python ...
emptyset

1
Tem certeza de que está invocando a versão do git de Cygwin? O problema Mintty 56 se aplica apenas a programas nativos do Windows.
ak2

Você encontrou uma solução para este problema?
pauldoo

Respostas:


9

OK, acho que encontrei uma solução definitiva.

O problema é que, independentemente do terminal usado (puttycyg, mintty, cmd.exe), o Git, por padrão, na ausência de alternativas melhor configuradas, tenta usar um "prompt de senha simples" (como você pode ler na descrição de core.askpass opção de configuração ).

O prompt de senha simples aparentemente funciona apenas no UNIX real, mas não no Cygwin.

A solução é instalar um programa compatível com SSH_ASKPASS para Windows e configurar o Git para usá-lo.

O que eu fiz foi:

  1. Instale o aplicativo win-ssh-askpass descompactando e copiando para C: \
  2. Baixe e instale o tempo de execução do Borland Delphi 5 exigido pelo win-ssh-askpass (difícil de encontrar hoje em dia, mas encontrei um em http://www.satsignal.eu/software/runtime.html )
  3. Configure o Git para obter senhas usando win-ssh-askpass: git config --global core.askpass "C:/win_ssh_askpass.exe" . Observe que o arquivo EXE possui sublinhados em seu nome, não sinais de menos.
  4. Lembre-se de sempre colocar seu login no URL ( https://<user>@<domain>/<repository>). Caso contrário, o Git solicitará o login antes de solicitar a senha, usando o mesmo utilitário askpass. Você pode, sem saber, digitar sua senha como o login, que será enviado ao administrador da Web e registrado em seu log de acesso como texto sem formatação!

Agora, o Git pede a senha usando uma janela elegante da interface gráfica do usuário e funciona independentemente do terminal usado :)


obrigado, corra aleatoriamente, mas corra :) Eu não sei por que o git não corre como o esperado. subversão fazê-lo bem.
corretge

1
Eu corri o seguinte e ele aparece um gui: git configuração --global core.askpass "git-gui - askpass" clone
Derek Greer

7

Eu experimentei o mesmo problema - no entanto, no meu caso, tenho SSH no servidor Cygwin, portanto, obviamente, um askpass da GUI do Win32 não funcionará.

Em vez disso, escrevi esse script simples para fazer o askpass. Eu pensei que poderia ser usado a partir de avisos regulares, obtendo o dispositivo tty de/bin/tty.exe mas isso não funcionou por um motivo desconhecido (sinta-se à vontade para tentar você mesmo ou procurar outra solução para obtê-lo, talvez eu tenha entendido errado de alguma maneira )

/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

Verifique se esse script é executável e use-o como a configuração core.askpass do seu git. Como esse script depende da variável $ SSH_TTY, normalmente funcionará apenas no SSH. No entanto, você pode definir $ SSH_TTY em .bashrcou .bash_profilese não estiver definido ; Dessa forma, ele deve funcionar mesmo em um console. A seguinte linha no seu script rc deve fazer isso:

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

Posso confirmar esta solução, funciona muito bem.
21412 schlamar #

Isso funcionou muito bem para mim também. No entanto, tive que adicionar um redirecionamento (1> & 2) à mensagem "Falha ao abrir ..." para que ela fique visível.
Eric

2

As soluções acima não funcionam para mim, mas encontrei outra.

você tem que executar o agente ssh

basta adicionar ao ~ / .bashrc e reiniciar o 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

O PS Chrome e o Opera usam quebra de linha que não é compatível com o bash - basta usar outro navegador para copiar e colar


1

É possível que você tenha um metacaractere, como &, no URL. Isso faria com que o git fosse executado em segundo plano e, em um sistema Unix, ele seria interrompido assim que tentasse ler do stdin. A ;também encerraria o comando no meio da linha e Ctrl-Cfaria com que o restante da linha (um comando separado) fosse abortado.

É interessante que gitinicialize o repositório /cygdrive/c/src/project/dev/.git/mesmo que você tenha solicitado a usá-lo ~/src/project/dev(a menos que você tenha seu diretório pessoal em um local estranho). Isso sugere que o gitcomando não está vendo o restante da linha de comando, o que aconteceria se houvesse uma mensagem perdida &ou ;na URL.

(Eu já tive esse problema muitas vezes wget, embora não com git.)

Experimente um git clonede um repositório diferente ou use um transporte diferente do mesmo repositório, para ver se githá uma confusão geral ou apenas para esse repositório. Você também pode tentar colocar aspas simples ao redor do URL.


~/srcé um link simbólico para /cygdrive/c/src( C:\src). Não há &no URL. Vou tentar clonar um repositório git pública, mas geralmente aqueles que não terá uma senha ...
emptyset

1

Dê uma olhada no seguinte problema - tenho quase certeza de que agora é apenas uma limitação da hortelã e da interoperabilidade com o Windows.

Edição 56 - mintty

Eu também tive problemas ao executar o mysql e outros do mintty - então, a resposta é que é um problema de emulação de terminal.


1

A pergunta já foi respondida ... Gostaria de adicionar como eu corrigi:

Verificando o Windows Git Bash, pude ver esse gitconjunto a seguirSSH_ASKPASS

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

Então, no Cygwin, adicionei a mesma variável ao .bashrc

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

ou

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

Fazendo isso, o git abre o SSH_ASKPASS do Git ... Não tive que instalar nenhum SW adicional nem criar nenhum script adicional.

Espero que isso possa ajudar!


0

Anos atrás, lembro-me de ter alguns problemas com a autenticação CVS do Cygwin ... era sobre a instalação do Cygwin com as terminações de linha de estilo DOS ou Unix (CRLF vs apenas LF); é uma das opções na caixa de diálogo do instalador. Se você escolhesse a pessoa errada (acho que foi o DOS que funcionou), a senha acabaria mutilada ou com um caráter falso ou algo assim.

De qualquer forma, pode valer a pena tentar a outra opção.


0

Eu tenho o mesmo problema, e, ao contrário desta linha , o problema ocorre com Cygwin GIT em todos os terminais possíveis - puttycyg, minttye o clássico do Windows cmd.exe.

Ainda estou procurando uma solução adequada, mas há uma solução alternativa - embora seja muito insegura, você pode tentar colocar a senha no URL do repositório, por exemplo:

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

A solução alternativa funciona para você?


0

Se é um repositório usado com freqüência, a coisa mais fácil pode ser criar um arquivo ~ / .netrc com

machine git.example.com
login yourlogin
password your password

Obviamente, você deve definir permissões draconianas apropriadas no arquivo.


Por que não usar ssh apenas como transporte?
vonbrand

0

Apenas um refinamento no comentário # 2

Há um cygwin ssh-ask-pass (não oficial) aqui

Basta baixar o tar.bz2 e descompactar na sua pasta cygwin. Ele funciona sem instalar o borland delphi runtime.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.