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


16

さて、これは奇妙です。まず、これはcygwinのsetup.exeから取得したgitを使用して、最新のcygwinで実行されるminttyです。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バージョンではなく、Cygwin gitバージョンを実行しています。

$ 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に送信されます。しかし、特定の問題が何であるかはわかりません。
デビッドZ

手がかりをありがとう-私はこれに出くわしました:code.google.com/p/mintty/issues/detail?id = 56-しかし、python実行可能ファイルのようなインタラクティブモードでgitを配置する方法はありません...
emptyset

1
Cygwinのバージョンのgitを呼び出していますか?Mintty issue 56は、ネイティブWindowsプログラムにのみ適用されます。
ak2

この問題の解決策を見つけましたか?
pauldoo

回答:


9

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

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

単純なパスワードプロンプトは、明らかに実際の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

1
私は次のことを実行し、それがGUIポップ:gitの設定--global core.askpass「のgit-guiの- askpassパッケージ」クローン
デレク・グリア

7

私は同じ問題を経験しました-しかし、私の場合、CygwinサーバーでSSHされているので、明らかにWin32 GUIのaskpassは機能しません。

代わりに、askpassを実行するためにこの単純なスクリプトを作成しました。私はttyデバイスを取得することで通常のプロンプトからも使用できますが、それは/bin/tty.exe未知の理由で動作しませんでした)。

/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

これも私にとってはとてもうまくいきました。ただし、その「Failed to open ...」メッセージを表示するには、リダイレクト(1>&2)を追加する必要がありました。
エリック

2

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

ssh agentを実行する必要があります

〜/ .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、このレポのために、一般的にまたはちょうど台無しにされています。URLを単一引用符で囲むこともできます。


~/src/cygdrive/c/srcC:\src)へのシンボリックリンクです。&URLにはありません。パブリックgitリポジトリのクローンを作成しますが、一般的にはパスワードはありません
...-emptyset

1

次の問題を見てください。これは、ミンティーの制限とWindowsとの相互運用性の制限に過ぎません。

問題56-ミンティー

また、myttyなどを実行する際にminttyから問題が発生しました。そのため、答えはターミナルエミュレーションの問題です。


1

質問は既に回答済みです...修正方法を追加したいだけです。

WindowsをチェックするとGit Bashgit次のセットが表示されます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を開きます...追加のSWをインストールしたり、追加のスクリプトを作成したりする必要はありませんでした。

これが役立つことを願っています!


0

何年も前に、CygwinのCVS認証に問題があったことを覚えています... CygwinをDOSでインストールしたか、Unixスタイルの行末(CRLF対LFのみ)でインストールしたかが関係していました。これは、インストーラーダイアログのオプションの1つです。間違ったもの(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

明らかに、ファイルに適切な厳しいアクセス許可を設定する必要があります。


トランスポートとしてsshを使用しないのはなぜですか?
フォンブランド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.