Cygwin / Git奇怪的终端问题


16

好吧,这很奇怪。首先,这是在最新的cygwin上运行的薄荷,从cygwin的setup.exe中提取了git。我正在运行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>

这里发生了什么?这是终端问题,shell问题,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。不会发送到git进程的stdin。但是我不知道具体的问题是什么。
David Z 2010年

谢谢您提供线索-我遇到了这个问题:code.google.com/p/mintty/issues/detail?id=56-但无法像python可执行文件一样将git置于交互模式下
emptyset

1
您确定要调用Cygwin的git版本吗?Mintty问题56仅适用于本机Windows程序。
ak2

您找到解决此问题的方法了吗?
pauldoo 2010年

Answers:


9

好的,我想我已经找到了确定的解决方案。

问题是,无论使用哪种终端(puttycyg,minty,cmd.exe),默认情况下,在没有更好配置的替代方案的情况下,Git都会尝试使用“简单密码提示”(如您所见)core.askpass config选项)。

简单的密码提示显然仅适用于实际的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实用程序在要求输入密码之前先要求登录。您可能在不知不觉中输入密码作为登录名,该密码将发送到Webserwer,并以纯文本形式登录在其访问日志中!

现在,Git使用优雅的GUI窗口询问密码,无论使用什么终端,它都可以工作:)


谢谢,随机运行,但运行:)我不知道为什么git没有按预期运行。颠覆做得很好。
corretge'2

1
我只运行了以下命令,并弹出一个gui:git config --global core.askpass“ git-gui--askpass” clone
Derek Greer

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设置为in,.bashrc或者设置为未.bash_profile设置;这样,它甚至可以在控制台上工作。rc脚本中的以下行应执行此操作:

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

我可以确认此解决方案,效果很好。
schlamar 2012年

这对我也很好。但是,我必须在该“无法打开...”消息上添加重定向(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普遍搞砸了该文件或仅针对该存储库。您也可以尝试在网址两边加上单引号。


~/src/cygdrive/c/srcC:\src)的符号链接。&URL中没有。我将尝试克隆一个公共git存储库,但通常这些存储库都没有密码...
emptyset 2010年

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 ...我不必安装任何其他软件或创建任何其他脚本。

希望这会有所帮助!


0

几年前,我记得Cygwin的CVS身份验证存在一些问题……这与是否以DOS或Unix样式的行尾(CRLF与LF)一起安装Cygwin有关。它是安装程序对话框中的选项之一。如果您选择了错误的密码(我认为DOS是可行的密码),则密码最终将被弄乱,或者带有伪造的字符或其他内容。

无论如何,可能值得尝试其他选择。


0

我有同样的问题,并且与此线程相反,在所有可能的终端使用Cygwin GIT出现问题- puttycygmintty和经典的Windows cmd.exe

我仍在寻找适当的解决方案,但是有一种解决方法-尽管它非常不安全,但是您可以尝试将密码放入存储库URL中,例如:

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

解决方法对您有用吗?


0

如果它是您经常使用的存储库,那么最简单的方法可能是使用以下命令创建〜/ .netrc文件:

machine git.example.com
login yourlogin
password your password

显然,您应该在文件上设置适当的draconian权限。


为什么不仅仅使用ssh作为传输方式呢?
vonbrand,2015年

0

只是对评论2的改进

有一个cygwin的ssh-问通(非官方)这里

只需下载tar.bz2并将其解压缩到cygwin文件夹中即可。它无需安装borland delphi运行时即可工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.