web-dev-qa-db-ja.com

Cygwin / Gitの奇妙なターミナルの問題

さて、これは変です。まず、これは最新のcygwinで実行されているminttyであり、gitはcygwinのsetup.exeから取得されます。私は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の問題ですか?

更新:はい、WindowsバージョンではなくCygwingitバージョンを実行しています:

$ 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
16
emptyset

OK、私は明確な解決策を見つけたと思います。

問題は、使用されている端末(puttycyg、mintty、cmd.exe)に関係なく、Gitはデフォルトで、より適切に構成された代替手段がない場合、「単純なパスワードプロンプト」を使用しようとすることです(の説明で読むことができます)。 core.askpass構成オプション )。

単純なパスワードプロンプトは、明らかに実際のUNIXでのみ機能し、Cygwinでは機能しません。

解決策は、Windows用のSSH_ASKPASS互換プログラムをインストールし、それを使用するようにGitを構成することです。

私がしたことは:

  1. 解凍してC:\にコピーすることにより、 win-ssh-askpass アプリケーションをインストールします。
  2. Win-ssh-askpassに必要なBorlandDelphi 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ユーティリティを使用して、パスワードを要求する前にログインを要求します。ログインとして無意識のうちにパスワードを入力する可能性があります。ログインはWebサーバーに送信され、プレーンテキストとしてアクセスログに記録されます。

これで、GitはエレガントなGUIウィンドウを使用してパスワードを要求し、使用する端末に関係なく機能します:)

同じ問題が発生しましたが、私の場合はCygwinサーバーでSSH接続されているため、明らかにWin32GUIのaskpassが機能しません。

代わりに、askpassを実行するためにこの単純なスクリプトを作成しました。 /bin/tty.exeからttyデバイスを取得することで通常のプロンプトからも使用できますが、不明な理由で機能しませんでした(自分で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)

上記の解決策は私にはうまくいきませんが、私は別の解決策を見つけました。

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

P.S. ChromeおよびOpera bashと互換性のない改行を使用してください-コピー&ペーストには別のブラウザを使用してください

2
Aloy

次の問題を見てください。これは、Windowsとのミンティと相互運用性の制限にすぎないと確信しています。

問題56-ミンティ

Minttyからmysqlなどを実行する際にも問題が発生しました。そのため、答えはターミナルエミュレーションの問題であるということです。

1
emptyset

質問はすでに回答済みです...修正方法を追加したいと思います。

Windows Git Bashを確認すると、SSH_ASKPASSの後にgitが設定されていることがわかりました。

$ 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を開きます...追加のSWをインストールしたり、追加のスクリプトを作成したりする必要はありませんでした。

これがお役に立てば幸いです。

1
W0rmH0le

URLに&などのメタ文字が含まれている可能性があります。これにより、gitがバックグラウンドで実行され、Unixシステムでは、stdinから読み取ろうとするとすぐに停止します。 ;も行の途中でコマンドを終了し、Ctrl-Cは行の残りの部分(別のコマンド)を中止します。

/cygdrive/c/src/project/dev/.git/を使用するように指示した場合でも、git~/src/project/devのリポジトリを初期化するのは興味深いことです(ホームディレクトリが奇妙な場所にある場合を除く)。これは、gitコマンドがコマンドラインの残りの部分を認識していないことを示しています。これは、URLに&または;が含まれていない場合に発生します。

(私はこの問題をwgetで何度も経験しましたが、gitでは発生しませんでした。)

別のリポジトリからのgit cloneを試すか、同じリポジトリからの別のトランスポートを使用して、gitが一般的に混乱しているか、このリポジトリのためだけに混乱しているかを確認してください。 URLを一重引用符で囲むこともできます。

1
Neil Mayhew

頻繁に使用するリポジトリの場合、最も簡単な方法は、〜/ .netrcファイルを作成することです。

machine git.example.com
login yourlogin
password your password

明らかに、ファイルに適切に厳格な権限を設定する必要があります。

0
Carson Chittom

私は同じ問題を抱えています、そしてこれとは反対に thread 、問題はすべての可能な端末でCygwinGITで発生します-puttycygminttyおよび古典的なWindowscmd.exe

私はまだ適切な解決策を探していますが、回避策があります-それは非常に安全ではありませんが、リポジトリのURLにパスワードを配置してみることができます:例:

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

回避策はあなたのために働きますか?

コメント#2 の改良点

Cygwin ssh-ask-pass(非公式)があります ここ

Tar.bz2をダウンロードして、cygwinフォルダーに解凍するだけです。 borlanddelphiランタイムをインストールしなくても機能します。

0
Raghu

数年前、CygwinのCVS認証に問題があったことを覚えています...それは、CygwinをDOSまたはUnixスタイルの行末(CRLFとLFのみ)のどちらでインストールしたかと関係がありました。これは、インストーラーダイアログのオプションの1つです。間違ったものを選択した場合(DOSが機能したと思います)、パスワードが壊れたり、偽の文字などが含まれたりします。

とにかく、他のオプションを試す価値があるかもしれません。

0
timday