Cygwin / Git Bizarre Terminal Issue

6489
emptyset

Хорошо, это странно. Во-первых, это mintty, работающий на современном Cygwin, с git, извлеченным из setupg 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 
15
Я угадываю терминальную проблему. Тот факт, что ваш пароль появляется, говорит о том, что терминал неправильно переводится в режим без вывода сообщений (где он не показывает введенные вами символы), а тот факт, что текст пароля появляется снова после нажатия клавиши `^ C`, предполагает, что персонажи не отправляются в stdin процесса git. Но я не знаю, какая конкретно проблема может быть. David Z 13 лет назад 1
Спасибо за подсказку - я наткнулся на это: http://code.google.com/p/mintty/issues/detail?id=56 - но нет способа перевести git в интерактивный режим, такой как исполняемый файл python ... emptyset 13 лет назад 0
Вы уверены, что используете версию Cygwin's git? Mintty выпуск 56 относится только к родным программам Windows. ak2 13 лет назад 1
Вы нашли решение этой проблемы? pauldoo 13 лет назад 0

10 ответов на вопрос

8
Aleksander Adamowski

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

Проблема в том, что независимо от используемого терминала (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 делать это хорошо. corretge 12 лет назад 0
Я просто запустил следующее, и он выдает графический интерфейс: git config --global core.askpass "git-gui - askpass" клон Derek Greer 9 лет назад 1
7
Thomas Guyot-Sionnest

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

Вместо этого я написал этот простой скрипт для выполнения 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 12 лет назад 0
Это работало довольно хорошо для меня тоже. Однако мне пришлось добавить перенаправление (1> & 2) в это сообщение «Не удалось открыть ...», чтобы оно было видимым. Eric 12 лет назад 0
2
Aloy

solutions above do not work for me, but I found another one.

you have to run ssh agent

just add to ~/.bashrc and restart 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/' > "$" echo succeeded chmod 600 "$" . "$" > /dev/null /usr/bin/ssh-add } if [ -f "$" ]; then . "$" > /dev/null ps -ef | grep $ | grep ssh-agent$ > /dev/null || { start_agent; } else start_agent; fi 

P.S. Chrome and Opera use linebreak which isn't compatible with bash - just use another browser for copy paste

1
Neil Mayhew

Возможно, у вас есть метасимвол, например &, в 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 13 лет назад 0
1
emptyset

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

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

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

1
W0rmH0le

На вопрос уже был дан ответ ... Я просто хотел бы добавить, как я исправил:

Проверяя 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
timday

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

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

0
Aleksander Adamowski

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

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

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

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

0
Raghu

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

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

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

0
Carson Chittom

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

machine git.example.com login yourlogin password your password 

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

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