Cygwin / Git 기괴한 터미널 문제


15

좋아, 이상해. 먼저, 이것은 최신 cygwin에서 실행되고 있으며, git은 cygwin의 setup.exe에서 가져옵니다. 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>

무슨 일이야? 이것은 터미널 문제, 쉘 문제, 자식 문제 또는 cygwin 문제입니까?

업데이트 : 예, Windows 버전이 아닌 Cygwin git 버전을 실행하고 있습니다.

$ 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
터미널 문제가 발생했습니다. 비밀번호가 표시되면 터미널이 자동 모드 (입력 한 문자가 표시되지 않음)로 제대로 전환되지 않았 음을 의미하며, 입력 한 후 비밀번호 텍스트가 다시 표시되면 문자가 잘못되었음을 나타 ^C냅니다. git 프로세스의 stdin으로 전송되지 않습니다. 그러나 특정 문제가 무엇인지 모릅니다.
David Z

- 단서 주셔서 감사합니다 나는이 건너 온 : code.google.com/p/mintty/issues/detail?id=56 -하지만 파이썬 실행 파일과 같은 대화 형 모드에서 자식을 넣을 수있는 방법은 ... 없다
emptyset

1
Cygwin의 git 버전을 호출하고 있습니까? Mintty 이슈 56은 기본 Windows 프로그램에만 적용됩니다.
ak2

이 문제에 대한 해결책을 찾았습니까?
pauldoo

답변:


9

좋아, 나는 확실한 해결책을 찾았다.

문제는 사용 된 터미널 (puttycyg, mintty, cmd.exe)에 관계없이 Git이 기본적으로 더 나은 대안이없는 경우 "간단한 암호 프롬프트"를 사용하려고 시도한다는 것입니다. core.askpass 구성 옵션 ).

간단한 암호 프롬프트는 분명히 실제 UNIX에서만 작동하지만 Cygwin에서는 작동하지 않습니다.

해결책은 Windows 용 SSH_ASKPASS 호환 프로그램을 설치하고이를 사용하도록 Git을 구성하는 것입니다.

내가 한 일은 :

  1. 포장을 풀고 C : \에 복사하여 win-ssh-askpass 응용 프로그램을 설치하십시오 .
  2. win-ssh-askpass에 필요한 Borland Delphi 5 런타임을 다운로드하여 설치하십시오 (현재는 어렵지만 http://www.satsignal.eu/software/runtime.html 에서 찾을 수 있음 )
  3. win-ssh-askpass :를 사용하여 비밀번호를 얻도록 Git을 구성하십시오 git config --global core.askpass "C:/win_ssh_askpass.exe". EXE 파일의 이름에는 마이너스 부호가 아닌 밑줄이 있습니다.
  4. 하는 것을 잊지 항상 URL에 로그인을 배치 ( https://<user>@<domain>/<repository>). 그렇지 않으면 Git은 동일한 askpass 유틸리티를 사용하여 비밀번호를 요청하기 전에 로그인을 요청합니다. 자신도 모르게 비밀번호를 로그인으로 입력 할 수 있습니다.이 비밀번호는 웹 브라우저로 전송되고 액세스 로그에 일반 텍스트로 기록됩니다!

이제 Git은 우아한 GUI 창을 사용하여 암호를 묻고 사용 된 터미널에 관계없이 작동합니다 :)


고마워, 무작위로 실행하지만 실행 :) 왜 git이 예상대로 실행되지 않는지 모르겠습니다. Subversion은 잘합니다.
corretge

1
난 그냥 다음을 실행하며 GUI가 나올 : 자식 설정 --global core.askpass "자식 - GUI - askpass"클론
데릭 그리어

7

나는 같은 문제를 겪었지만 Cygwin 서버에서 SSH를 사용했기 때문에 Win32 GUI askpass가 작동하지 않습니다.

대신, 나는 askpass를하기 위해이 간단한 스크립트를 작성했다. 나는 tty 장치를 가져 와서 일반 프롬프트에서도 사용할 수 /bin/tty.exe있지만 알 수없는 이유로 작동하지 않았습니다 (자신을 tty하거나 tty를 얻을 수있는 다른 솔루션을 찾으십시오. 어쩌면 잘못되었습니다) ).

/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

이 스크립트가 실행 가능한지 확인하고 git의 core.askpass 설정으로 사용하십시오. 이 스크립트는 $ SSH_TTY 변수에 의존하기 때문에 일반적으로 SSH에서만 작동합니다. 그러나 $ SSH_TTY를 설정 .bashrc하거나 .bash_profile설정하지 않은 경우; 이런 식으로 콘솔에서도 작동합니다. rc 스크립트에서 다음 행을 수행해야합니다.

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

이 솔루션을 확인할 수 있으며 매우 잘 작동합니다.
schlamar

이것은 나에게도 잘 작동했습니다. 그러나 표시하려면 "열지 못했습니다 ..."메시지에 리디렉션 (1> & 2)을 추가해야했습니다.
Eric

2

위의 솔루션은 저에게 효과적이지 않지만 다른 솔루션을 찾았습니다.

당신은 ssh 에이전트를 실행해야합니다

~ / .bashrc에 추가하고 콘솔을 다시 시작하십시오.

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 및 Opera는 bash와 호환되지 않는 줄 바꿈을 사용합니다. 복사 붙여 넣기에는 다른 브라우저를 사용하십시오.


1

&URL에 메타 문자 (예 : 등)가있을 수 있습니다 . 이로 인해 git이 백그라운드에서 실행되고 Unix 시스템에서는 stdin에서 읽으려고하자마자 중지됩니다. A ;는 또한 라인을 통해 도중에 명령을 종료하고 Ctrl-C나머지 라인 (별도의 명령)을 중단시킵니다.

홈 디렉토리가 이상한 곳이 아닌 한 사용하도록 지시했지만 git레포 를 초기화하는 것은 흥미 롭습니다 . 이것은 명령이 명령 행의 나머지 부분을 보지 못하고 있음을 시사합니다. 이는 길 잃 거나 URL에 있을 때 발생합니다 ./cygdrive/c/src/project/dev/.git/~/src/project/devgit&;

(와는 wget아니지만 이 문제가 여러 번 발생 했습니다 git.)

를 시도 git clone다른 REPO에서, 또는 있는지, 같은 REPO에서 다른 전송을 사용하여 git이 REPO에 대한 일반적 아니면 그냥 엉망이된다. URL을 작은 따옴표로 묶을 수도 있습니다.


~/src/cygdrive/c/src( C:\src)에 대한 심볼릭 링크 입니다. &URL에 없습니다 . 공개 git 저장소를 복제하려고 시도하지만 일반적으로 암호가 없습니다 ...
emptyset

1

다음 문제를 살펴보십시오. 이제는 Windows와의 민트 및 상호 운용성의 한계에 불과합니다.

이슈 56-박하

나는 또한 mysql을 실행하는 데 문제가 있었고 민트에서 그런 문제를 겪었습니다. 따라서 대답은 터미널 에뮬레이션 문제라는 것입니다.


1

질문에 이미 답변되었습니다 ... 나는 어떻게 고쳤는지 추가하고 싶습니다.

Windows를 확인 Git Bash하면 git다음 세트를 볼 수 있습니다.SSH_ASKPASS

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

Cygwin에서 동일한 변수를 .bashrc

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

또는

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

이렇게하면 git은 Git에서 SSH_ASKPASS를 엽니 다. 추가 SW를 설치하거나 추가 스크립트를 만들 필요가 없었습니다.

이것이 도움이되기를 바랍니다!


0

몇 년 전 Cygwin의 CVS 인증에 문제가 있었음을 기억합니다. Cygwin을 DOS 또는 Unix 스타일 줄 끝 (CRLF 대 LF)으로 설치했는지 여부와 관련이있었습니다. 설치 프로그램 대화 상자의 옵션 중 하나입니다. 잘못된 것을 고르면 (DOS가 효과가 있다고 생각합니다) 암호가 엉망이되거나 가짜 문자 등이 생길 수 있습니다.

어쨌든 다른 옵션을 시도해 볼 가치가 있습니다.


0

저도 같은 문제를 가지고 있고,이 반대로 스레드 , 문제는 가능한 모든 단말기에서 Cygwin에서 GIT 발생 - puttycyg, mintty그리고 고전 윈도우 cmd.exe.

여전히 올바른 해결책을 찾고 있지만 해결 방법이 있습니다. 매우 안전하지는 않지만 저장소 URL에 암호를 입력하십시오.

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

해결 방법이 효과가 있습니까?


0

자주 사용하는 저장소라면 ~ / .netrc 파일을 만드는 것이 가장 쉬운 방법입니다.

machine git.example.com
login yourlogin
password your password

파일에 대해 적절한 draconian 권한을 설정해야합니다.


왜 ssh를 전송 수단으로 사용하지 않습니까?
vonbrand

0

의견 # 2대한 개선

cygwin ssh-ask-pass (비공식)가 있습니다.

tar.bz2를 다운로드하고 cygwin 폴더에 압축을 풉니 다. borland delphi runtime을 설치하지 않고도 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.