Cygwin / Git Bizarre Terminal Issue

16

W porządku, to dziwne. Po pierwsze, jest to bardzo funkcjonalne na aktualnym cygwin, z git pobranym z setup.exe cygwin. Używam 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>

Co tu się dzieje? Czy jest to problem terminalny, problem z powłoką, problem z gitem lub problem z cygwinem?

Aktualizacja: Tak, korzystam z wersji git Cygwin, a nie 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
emptyset
źródło
1
Zgaduję, że problem z terminalem. Pojawienie się hasła sugeruje, że terminal nie jest poprawnie przełączany w tryb cichy (w którym nie wyświetla wpisywanych znaków), a fakt, że hasło pojawia się ponownie po naciśnięciu, ^Csugeruje, że znaki nie są „ zostanie wysłany do standardowego procesu git. Ale nie wiem, jaki może być konkretny problem.
David Z
Dzięki za wskazówkę - natknąłem się na to: code.google.com/p/mintty/issues/detail?id=56 - ale nie ma sposobu, aby wprowadzić gita w tryb interaktywny, taki jak plik wykonywalny python ...
emptyset
1
Czy na pewno przywołujesz wersję git Cygwina? Mintty numer 56 dotyczy tylko rodzimych programów Windows.
ak2
Czy znalazłeś rozwiązanie tego problemu?
pauldoo,

Odpowiedzi:

9

OK, myślę, że znalazłem konkretne rozwiązanie.

Problem polega na tym, że niezależnie od używanego terminala (puttycyg, mintty, cmd.exe), Git domyślnie, przy braku lepiej skonfigurowanych alternatyw, próbuje użyć „prostego monitu o hasło” (jak można przeczytać w opisie core.askpass opcja konfiguracji ).

Prosty monit o podanie hasła najwyraźniej działa tylko na prawdziwym systemie UNIX, ale nie na Cygwin.

Rozwiązaniem jest zainstalowanie programu kompatybilnego z SSH_ASKPASS dla Windows i skonfigurowanie Gita, aby go używał.

To co zrobiłem to:

  1. Zainstaluj aplikację win-ssh-askpass , rozpakowując i kopiując do C: \
  2. Pobierz i zainstaluj środowisko uruchomieniowe Borland Delphi 5 wymagane przez win-ssh-askpass (obecnie trudno je znaleźć, ale znalazło się na stronie http://www.satsignal.eu/software/runtime.html )
  3. Konfiguracja Git uzyskanie haseł stosując WIN-ssh-askpass: git config --global core.askpass "C:/win_ssh_askpass.exe". Zauważ, że plik EXE ma podkreślenia w nazwie, a nie znaki minus.
  4. Pamiętaj, aby zawsze umieszczać swój login w adresie URL ( https://<user>@<domain>/<repository>). W przeciwnym razie Git poprosi o login, zanim poprosi o hasło, używając tego samego narzędzia askpass. Możesz nieświadomie wprowadzić hasło jako login, które zostanie wysłane do serwera WWW i zalogowane w dzienniku dostępu jako zwykły tekst!

Teraz Git prosi o hasło przy użyciu eleganckiego okna GUI i działa niezależnie od używanego terminala :)

Aleksander Adamowski
źródło
dzięki, uruchamiaj losowo, ale działa :) Nie wiem, dlaczego git nie działa zgodnie z oczekiwaniami. subversion robi to dobrze.
skoryguj
1
Właśnie uruchomiłem następujące polecenie i wyświetla GUI: git config --global core.askpass "git-gui - askpass" klon
Derek Greer
7

Wystąpił ten sam problem - jednak w moim przypadku jestem SSH na serwerze Cygwin, więc oczywiście askpass Win32 GUI nie będzie działać.

Zamiast tego napisałem ten prosty skrypt, aby wykonać askpass. Myślałem, że można go również użyć z regularnych podpowiedzi, pobierając urządzenie tty, /bin/tty.exeale to nie zadziałało z niewiadomego powodu (nie krępuj się sam lub poszukaj innego rozwiązania, aby uzyskać tty, być może popełniłem błąd ).

/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

Upewnij się, że ten skrypt jest wykonywalny i użyj go jako ustawienia core.askpass twojego gita. Ponieważ ten skrypt opiera się na zmiennej $ SSH_TTY, zwykle działa tylko z SSH. Możesz jednak ustawić $ SSH_TTY w .bashrclub .bash_profilejeśli nie jest ustawiony; w ten sposób powinno działać nawet z konsoli. Powinien to zrobić następujący wiersz w skrypcie rc:

[ -z "$SSH_TTY" ] && export SSH_TTY=$(/bin/tty.exe)
Thomas Guyot-Sionnest
źródło
Mogę potwierdzić to rozwiązanie, działa bardzo dobrze.
schlamar
To również działało całkiem dobrze dla mnie. Musiałem jednak dodać przekierowanie (1> i 2) do tego komunikatu „Nie udało się otworzyć ...”, aby był widoczny.
Eric
2

powyższe rozwiązania nie działają dla mnie, ale znalazłem inne.

musisz uruchomić agenta ssh

po prostu dodaj do ~ / .bashrc i uruchom ponownie konsolę

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 i Opera używają podziału linii, który nie jest kompatybilny z bash - wystarczy użyć innej przeglądarki do wklejania kopii

Aloy
źródło
1

Możliwe, że masz metaznak, np. &W adresie URL. Spowodowałoby to, że git działałby w tle, a na systemie uniksowym byłby zatrzymywany, gdy tylko próbował czytać ze standardowego wejścia. A ;również zakończyłoby polecenie w połowie linii, a Ctrl-Cspowodowałoby przerwanie reszty linii (osobne polecenie).

To ciekawe, że gitinicjuje repozytorium, /cygdrive/c/src/project/dev/.git/nawet jeśli kazałeś go użyć ~/src/project/dev(chyba że masz katalog domowy w dziwnym miejscu). Sugerowałoby to, że gitpolecenie nie widzi reszty wiersza polecenia, co stałoby się, gdyby był błąd &lub ;adres URL.

(Miałem ten problem wiele razy wget, chociaż nie z git.)

Wypróbuj inną git clonez repozytorium lub użyj innego transportu z tej samej repozytorium, aby sprawdzić, czy gitjest to ogólnie popsute, czy tylko dla tego repozytorium. Możesz także spróbować umieścić pojedyncze cudzysłowy wokół adresu URL.

Neil Mayhew
źródło
~/srcjest dowiązaniem symbolicznym do /cygdrive/c/src( C:\src). Nie ma &adresu URL. Spróbuję sklonować publiczne repozytorium git, ale generalnie te nie będą miały hasła ...
emptyset
1

Spójrz na następujący problem - jestem całkiem pewien, że teraz jest to tylko ograniczenie mięty i interoperacyjności z Windows.

Numer 56 - miętowy

Miałem również problemy z uruchomieniem mysql i takich z mintty - więc odpowiedź jest taka, że ​​jest to problem emulacji terminala.

emptyset
źródło
1

Pytanie zostało już udzielone ... Chciałbym tylko dodać, jak to naprawiłem:

Sprawdzając system Windows Git Bash, zobaczyłem gitnastępujący zestawSSH_ASKPASS

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

Tak więc w Cygwin dodałem tę samą zmienną do .bashrc

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

lub

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

Robiąc to, git otwiera SSH_ASKPASS z Git ... Nie musiałem instalować żadnego dodatkowego oprogramowania ani tworzyć żadnego dodatkowego skryptu.

Mam nadzieję, że to może pomóc!

W0rmH0le
źródło
0

Wiele lat temu pamiętam pewne problemy z uwierzytelnianiem CVS Cygwina ... miało to związek z tym, czy zainstalowałeś Cygwina z zakończeniami linii w stylu DOS lub Unix (CRLF vs tylko LF); jest to jedna z opcji w oknie dialogowym instalatora. Jeśli wybierzesz niewłaściwy (myślę, że DOS był tym, który działał), hasło skończyłoby się zniekształceniem lub fałszywym charakterem lub czymś takim.

W każdym razie warto wypróbować drugą opcję.

czas
źródło
0

Mam ten sam problem, i, w przeciwieństwie do tego wątku , problem występuje z Cygwin GIT we wszystkich możliwych terminali - puttycyg, minttyi klasycznego systemu Windowscmd.exe .

Wciąż szukam odpowiedniego rozwiązania, ale istnieje obejście - chociaż jest bardzo niepewne, możesz spróbować umieścić hasło w adresie URL repozytorium, np .:

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

Czy to obejście działa dla Ciebie?

Aleksander Adamowski
źródło
0

Jeśli często używasz repozytorium, najłatwiej jest utworzyć plik ~ / .netrc

machine git.example.com
login yourlogin
password your password

Oczywiście powinieneś ustawić odpowiednio drakońskie uprawnienia do pliku.

Carson Chittom
źródło
Dlaczego po prostu nie użyć ssh jako transportu?
vonbrand,
0

Tylko udoskonalenie komentarza nr 2

Jest Cygwin ssh-ask-pass (nieoficjalny) tutaj

Wystarczy pobrać plik tar.bz2 i rozpakować w folderze cygwin. Działa bez instalowania środowiska uruchomieniowego Borland Delphi.

Raghu
źródło