Випуск терміналу Cygwin / Git Bizarre


16

Добре, це дивно. По-перше, це монетний двір, який працює на сучасній cygwin, з git, витягнутим з setupexe 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 надсилається до stdin процесу git. Але я не знаю, яка конкретна проблема може бути.
Девід Z

Дякую за підказку - я натрапив на це: code.google.com/p/mintty/isissue/detail?id=56 - але немає можливості перевести git в інтерактивний режим, як виконуваний python ...
emptyset

1
Ви впевнені, що ви посилаєтесь на версію git Cygwin? Монетний випуск 56 стосується лише рідних програм Windows.
ak2

Ви знайшли рішення цієї проблеми?
pauldoo

Відповіді:


9

Гаразд, я думаю, що я знайшов певне рішення.

Проблема полягає в тому, що незалежно від використовуваного терміналу (puttycyg, mintty, cmd.exe) Git за замовчуванням, за відсутності кращих налаштованих альтернатив, намагається використати "просте запит пароля" (як ви можете прочитати в описі core.askpass параметр config ).

Просте запит пароля, мабуть, працює лише в реальному 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 запитує пароль за допомогою елегантного вікна графічного інтерфейсу та працює незалежно від використовуваного терміналу :)


дякую, бігай випадковим чином, але працює :) Я не знаю, чому git не працює так, як очікувалося. підривні роботи роблять це добре.
коррет

1
Я щойно запустив наступне, і він спливає з gui: git config --global core.askpass "git-gui - askpass" клон
Дерек Грір

7

У мене виникла та сама проблема - проте в моєму випадку я SSH'd на сервері Cygwin, тому очевидно, що пропускний інтерфейс Win32 GUI не працюватиме.

Натомість я написав цей простий скрипт, щоб зробити пропуск. Я хоч міг би його використовувати і з регулярних підказок, отримуючи пристрій tty, /bin/tty.exeале це не працювало з невідомих причин (не соромтеся виправити себе або шукайте інше рішення, щоб отримати 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. Оскільки цей скрипт спирається на змінну $ SSH_TTY, він, як правило, працює лише від SSH. Однак ви можете встановити $ SSH_TTY у .bashrcабо, .bash_profileякщо не встановлено; таким чином він повинен працювати навіть з консолі. Наступний рядок у вашому сценарії rc повинен це зробити:

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

Я можу підтвердити це рішення, працює дуже добре.
шламар

Це працювало досить добре і для мене. Однак мені довелося додати переспрямування (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 використовують linebreak, який не сумісний з bash - просто використовуйте інший браузер для копіювання пасти


1

Можливо, у вас є метахарактер, наприклад &, в URL-адресі. Це призведе до запуску git у фоновому режимі, а в системі Unix його буде зупинено, як тільки він спробує прочитати з stdin. A ;також припиняє команду частиною через лінію, а також Ctrl-Cпризведе до переривання решти рядка (окрема команда).

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

(У мене була ця проблема багато разів wget, хоча не з git.)

Спробуйте a git cloneз іншого репо або використовуючи інший транспорт від того ж репо, щоб побачити, чи gitне псується загалом або просто для цього репо. Ви також можете спробувати поставити окремі лапки навколо 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 відкриває 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.