15

Хорошо, это странно. Во-первых, это 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

10 ответов10

8

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

Проблема в том, что независимо от используемого терминала (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 для получения паролей, используя win-ssh-askpass: git config --global core.askpass "C:/win_ssh_askpass.exe" . Обратите внимание, что в имени файла EXE подчеркивание, а не знак минус.
  4. Не забудьте всегда указывать свой логин в URL (https://<user>@<domain>/<repository>). В противном случае, Git запросит логин, прежде чем запрашивать пароль, используя ту же утилиту askpass. Вы можете неосознанно ввести свой пароль в качестве логина, который будет отправлен на веб-сервер и зарегистрирован в его журнале доступа в виде простого текста!

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

7

У меня возникла та же проблема - однако в моем случае я являюсь 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)
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

Взгляните на следующую проблему - теперь я уверен, что это всего лишь ограничение мятежности и совместимости с 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 ... Мне не нужно было устанавливать какие-либо дополнительные программные продукты или создавать дополнительные сценарии.

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

1

Возможно, у вас есть метасимвол, такой как & , в URL. Это приведет к тому, что git будет работать в фоновом режиме, и в системе Unix он будет остановлен, как только он попытается прочитать из stdin. А ; будет также завершать команду на полпути через строку, а Ctrl-C приведет к отмене остальной части строки (отдельная команда).

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

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

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

0

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

machine git.example.com
login yourlogin
password your password

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

0

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

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

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

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

0

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

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

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

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .