Cygwin / Git Bizarre Terminal Issue


16

Хорошо, это странно. Во-первых, это mintty, работающий на современном Cygwin, с git, извлеченным из setup.exe cygwin. Я бегу 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>

Что здесь происходит? Это проблема терминала, проблема оболочки, проблема с git или проблема с cygwin?

Обновление: Да, я использую версию Cygwin git, а не версию 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
Я угадываю терминальную проблему. Тот факт, что ваш пароль появляется, говорит о том, что терминал не переводится должным образом в режим без вывода сообщений (где он не показывает введенные вами символы), а тот факт, что текст пароля появляется снова после нажатия, ^Cпредполагает, что символы не отображаются. t отправляется на стандартный ввод процесса git. Но я не знаю, какая конкретно проблема может быть.
Дэвид З

Спасибо за подсказку - я наткнулся на это: code.google.com/p/mintty/issues/detail?id=56 - но нет способа перевести git в интерактивный режим, как исполняемый файл python ...
emptyset

1
Вы уверены, что используете версию Cygwin's git? Mintty выпуск 56 относится только к родным программам Windows.
ak2

Вы нашли решение этой проблемы?
Pauldoo

Ответы:


9

ОК, я думаю, что нашел определенное решение.

Проблема заключается в том, что независимо от используемого терминала (puttycyg, mintty, cmd.exe), Git по умолчанию, при отсутствии более настроенных альтернатив, пытается использовать «простое приглашение пароля» (как вы можете прочитать в описании core.askpass опция конфигурации ).

Простая подсказка пароля, очевидно, работает только в реальной UNIX, но не в Cygwin.

Решение состоит в том, чтобы установить SSH_ASKPASS-совместимую программу для Windows и настроить Git для ее использования.

То, что я сделал, было:

  1. Установите приложение win-ssh-askpass , распаковав и скопировав в C: \
  2. Загрузите и установите среду выполнения Borland Delphi 5, необходимую для win-ssh-askpass (в настоящее время трудно найти, но ее можно найти на http://www.satsignal.eu/software/runtime.html ).
  3. Настройка Git для получения паролей с помощью обоюдного SSH-askpass: git config --global core.askpass "C:/win_ssh_askpass.exe". Обратите внимание, что в имени файла EXE подчеркивание, а не знак минус.
  4. Не забудьте всегда указывать свой логин в URL ( https://<user>@<domain>/<repository>). В противном случае Git запросит логин, прежде чем запрашивать пароль, используя ту же утилиту askpass. Вы можете неосознанно ввести свой пароль в качестве логина, который будет отправлен на веб-сервер и зарегистрирован в журнале доступа в виде простого текста!

Теперь Git запрашивает пароль, используя элегантное окно графического интерфейса, и работает независимо от используемого терминала :)


спасибо, запускаю случайно, но работает :) Я не знаю, почему git работает не так, как ожидалось. Subversion делает это нормально.
Коррекция

1
Я просто запустил следующее, и он выдает графический интерфейс: git config --global core.askpass "git-gui - askpass" клон
Дерек Грир

7

У меня возникла та же проблема - однако в моем случае я являюсь SSH-сервером на сервере Cygwin, поэтому очевидно, что Askpass Win32 не работает.

Вместо этого я написал этот простой скрипт для выполнения 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) в это сообщение «Не удалось открыть ...», чтобы оно было видимым.
Эрик

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инициализация репозитория происходит, /cygdrive/c/src/project/dev/.git/даже если вы сказали ему использовать ~/src/project/dev(если у вас нет домашнего каталога в странном месте). Это говорит о том , что gitкоманда не видит остальную часть командной строки, которая является то , что случилось бы , если бы был паразитный &или ;в URL.

(У меня была эта проблема много раз wget, хотя не с git.)

Попробуйте использовать git cloneдругой репозиторий или использовать другой транспорт из того же репо, чтобы посмотреть, gitне испорчен ли он вообще или только для этого репо. Вы также можете попробовать поместить одинарные кавычки вокруг URL.


~/srcсимволическая ссылка на /cygdrive/c/src( C:\src). Там нет &в URL. Я попытаюсь клонировать публичный репозиторий git, но обычно у них не будет пароля ...
emptyset

1

Взгляните на следующую проблему - теперь я уверен, что это всего лишь ограничение мятежности и совместимости с Windows.

Выпуск 56 - мятный

У меня также были проблемы с запуском mysql и т.п. от mintty, поэтому ответ таков: это проблема эмуляции терминала.


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 открывает SSH_ASKPASS из Git ... Мне не нужно было устанавливать дополнительные SW или создавать дополнительные скрипты.

Надеюсь, что это может помочь!


0

Несколько лет назад я помню, что у меня были проблемы с CVS-аутентификацией Cygwin ... это было связано с тем, установили ли вы Cygwin с окончаниями линий в стиле DOS или Unix (CRLF против просто LF); это один из параметров в диалоговом окне установщика. Если вы выбрали неправильный вариант (я думаю, что DOS был тем, который работал), пароль в конечном итоге был искажен или имел поддельный символ или что-то в этом роде.

В любом случае, возможно, стоит попробовать другой вариант.


0

У меня такая же проблема, и, вопреки эту тему , проблема возникает с Cygwin GIT во всех возможных терминалах - puttycyg, minttyа классическая для Windows cmd.exe.

Я все еще ищу правильное решение, но есть обходной путь - хотя это очень небезопасно, вы можете попробовать поместить пароль в URL репозитория, например:

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

Работает ли обходной путь для вас?


0

Если вы часто используете репозиторий, проще всего создать файл ~ / .netrc с

machine git.example.com
login yourlogin
password your password

Очевидно, вы должны установить драконовские права доступа к файлу.


Почему бы просто не использовать ssh в качестве транспорта?
vonbrand

0

Просто уточнение к комментарию № 2

Там в Cygwin SSH-аск проход (неофициальный) здесь

Просто скачайте tar.bz2 и распакуйте в вашу папку cygwin. Работает без установки Borland Delphi Runtime.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.