Problème de terminal Cygwin / Git Bizarre

16

D'accord, c'est bizarre. Tout d'abord, cela fonctionne parfaitement sur cygwin à jour, avec git tiré de setup.exe de cygwin. J'utilise 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>

Qu'est-ce qui se passe ici? Est-ce un problème de terminal, un problème de shell, un problème de git ou un problème de cygwin?

Mise à jour: Oui, j'exécute la version Cygwin git, pas la version 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
ensemble vide
la source
1
Je devine un problème terminal. Le fait que votre mot de passe apparaisse suggère que le terminal n'est pas correctement mis en mode silencieux (où il n'affiche pas les caractères que vous tapez), et le fait que le texte du mot de passe réapparaisse après que vous ayez appuyé ^Csuggère que les caractères ne sont pas ' t envoyé à stdin du processus git. Mais je ne sais pas quel pourrait être le problème spécifique.
David Z
Merci pour l'indice - je suis tombé sur ceci: code.google.com/p/mintty/issues/detail?id=56 - mais il n'y a aucun moyen de mettre git en mode interactif comme l'exécutable python ...
emptyset
1
Êtes-vous sûr que vous invoquez la version de Cygwin de git? Le problème 56 de Mintty ne s'applique qu'aux programmes Windows natifs.
ak2
Avez-vous trouvé une solution à ce problème?
pauldoo

Réponses:

9

OK, je pense avoir trouvé une solution définitive.

Le problème est que, quel que soit le terminal utilisé (puttycyg, mintty, cmd.exe), Git par défaut, en l'absence d'alternatives mieux configurées, essaie d'utiliser une "invite de mot de passe simple" (comme vous pouvez le lire dans la description de core.askpass option de configuration ).

L'invite de mot de passe simple ne fonctionne apparemment que sur UNIX réel, mais pas sur Cygwin.

La solution consiste à installer un programme compatible SSH_ASKPASS pour Windows et à configurer Git pour l'utiliser.

Ce que j'ai fait, c'est:

  1. Installez l'application win-ssh-askpass en déballant et en copiant vers C: \
  2. Téléchargez et installez le runtime Borland Delphi 5 requis par win-ssh-askpass (difficile à trouver de nos jours, mais trouvé sur http://www.satsignal.eu/software/runtime.html )
  3. Configurer Git pour obtenir des mots de passe à l' aide de gagnant-ssh-askpass: git config --global core.askpass "C:/win_ssh_askpass.exe". Notez que le fichier EXE a des traits de soulignement dans son nom, pas des signes moins.
  4. N'oubliez pas de toujours placer votre identifiant dans l'URL ( https://<user>@<domain>/<repository>). Sinon, Git demandera la connexion avant de demander le mot de passe, en utilisant le même utilitaire askpass. Vous pouvez, sans le savoir, entrer votre mot de passe comme identifiant, qui sera envoyé au webserwer et enregistré dans son journal d'accès en texte brut!

Maintenant, Git demande le mot de passe à l'aide d'une élégante fenêtre GUI et fonctionne quel que soit le terminal utilisé :)

Aleksander Adamowski
la source
merci, exécutez au hasard, mais fonctionne :) Je ne sais pas pourquoi git ne fonctionne pas comme prévu. subversion le fait bien.
corretge
1
Je viens d'exécuter ce qui suit et il apparaît un gui: git config --global core.askpass "git-gui - askpass" clone
Derek Greer
7

J'ai rencontré le même problème - mais dans mon cas, je suis SSH sur le serveur Cygwin, donc évidemment un askpass GUI Win32 ne fonctionnera pas.

Au lieu de cela, j'ai écrit ce script simple pour faire l'askpass. Je pensais que cela pouvait également être utilisé à partir d'invites régulières en obtenant le périphérique tty, /bin/tty.exemais cela n'a pas fonctionné pour une raison inconnue (n'hésitez pas à vous tty ou à chercher une autre solution pour obtenir le tty, peut-être que je me suis trompé d'une manière ou d'une autre ).

/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

Assurez-vous que ce script est exécutable et utilisez-le comme paramètre core.askpass de votre git. Étant donné que ce script repose sur la variable $ SSH_TTY, il ne fonctionnera normalement qu'à partir de SSH. Vous pouvez cependant définir $ SSH_TTY dans .bashrcou .bash_profiles'il n'est pas défini ; de cette façon, cela devrait fonctionner même à partir d'une console. La ligne suivante dans votre script rc devrait le faire:

[ -z "$SSH_TTY" ] && export SSH_TTY=$(/bin/tty.exe)
Thomas Guyot-Sionnest
la source
Je peux confirmer cette solution, fonctionne très bien.
schlamar
Cela a très bien fonctionné pour moi aussi. Cependant, j'ai dû ajouter une redirection (1> & 2) sur ce message "Impossible d'ouvrir ..." pour qu'il soit visible.
Eric
2

les solutions ci-dessus ne fonctionnent pas pour moi, mais j'en ai trouvé une autre.

vous devez exécuter l'agent ssh

ajoutez simplement à ~ / .bashrc et redémarrez 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 et Opera utilisent un saut de ligne qui n'est pas compatible avec bash - utilisez simplement un autre navigateur pour copier-coller

Aloy
la source
1

Il est possible que vous ayez un métacaractère, tel que &dans l'URL. Cela provoquerait l'exécution de git en arrière-plan, et sur un système Unix, il serait arrêté dès qu'il tenterait de lire depuis stdin. A ;mettrait également fin à la commande à mi-chemin de la ligne et Ctrl-Centraînerait l'abandon du reste de la ligne (une commande distincte).

C'est intéressant qui gitinitialise le dépôt /cygdrive/c/src/project/dev/.git/même si vous lui avez dit d'utiliser~/src/project/dev (sauf si vous avez votre répertoire personnel dans un endroit étrange). Cela suggérerait que la gitcommande ne voit pas le reste de la ligne de commande, ce qui se produirait s'il y avait une erreur &ou ;dans l'URL.

(J'ai eu ce problème plusieurs fois avec wget , mais pas avec git.)

Essayez un à git clonepartir d'un référentiel différent, ou utilisez un transport différent du même référentiel, pour voir s'il gitest gâché de manière générale ou uniquement pour ce référentiel. Vous pouvez également essayer de mettre des guillemets simples autour de l'URL.

Neil Mayhew
la source
~/srcest un lien symbolique vers /cygdrive/c/src( C:\src). Il n'y a pas &d'URL. J'essaierai de cloner un dépôt git public, mais généralement ceux-ci n'auront pas de mot de passe ...
emptyset
1

Jetez un œil au problème suivant - je suis presque certain maintenant que c'est juste une limitation de menthe et d'interopérabilité avec Windows.

Numéro 56 - Mintty

J'ai également eu des problèmes avec mysql et autres depuis mintty - donc, la réponse est que c'est un problème d'émulation de terminal.

ensemble vide
la source
1

La question a déjà été répondue ... Je voudrais juste ajouter comment j'ai corrigé:

En vérifiant Windows Git Bash, je pouvais voir cet gitensemble suivantSSH_ASKPASS

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

Donc, sur Cygwin, j'ai ajouté la même variable à .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"

Ce faisant, git ouvre le SSH_ASKPASS de Git ... Je n'ai pas eu à installer de logiciel supplémentaire ni à créer de script supplémentaire.

J'espère que cela peut vous aider!

W0rmH0le
la source
0

Il y a des années, je me souviens avoir eu quelques problèmes avec l'authentification CVS de Cygwin ... c'était pour savoir si vous aviez installé Cygwin avec les terminaisons de ligne de style DOS ou Unix (CRLF vs juste LF); c'est l'une des options de la boîte de dialogue du programme d'installation. Si vous avez choisi le mauvais (je pense que DOS était celui qui fonctionnait), le mot de passe finirait par être altéré ou avec un caractère faux ou quelque chose.

Quoi qu'il en soit, cela pourrait valoir la peine d'essayer l'autre option.

timday
la source
0

J'ai le même problème et, contrairement à ce fil , le problème se produit avec Cygwin GIT dans tous les terminaux possibles - puttycyg, minttyet Windows classiquecmd.exe .

Je suis toujours à la recherche d'une solution appropriée, mais il existe une solution de contournement - bien que ce soit très peu sûr, vous pouvez essayer de placer le mot de passe dans l'URL du référentiel, par exemple:

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

La solution de contournement fonctionne-t-elle pour vous?

Aleksander Adamowski
la source
0

S'il s'agit d'un référentiel que vous utilisez souvent, la chose la plus simple peut être de créer un fichier ~ / .netrc avec

machine git.example.com
login yourlogin
password your password

De toute évidence, vous devez définir des autorisations draconiennes appropriées sur le fichier.

Carson Chittom
la source
Pourquoi ne pas simplement utiliser ssh comme moyen de transport?
vonbrand
0

Juste un raffinement sur le commentaire # 2

Il y a un cyshwin ssh-ask-pass (non officiel) ici

Téléchargez simplement le fichier tar.bz2 et décompressez dans votre dossier cygwin. Il fonctionne sans installer le runtime borland delphi.

Raghu
la source