Masalah Terminal Aneh Cygwin / Git

16

Baiklah, ini aneh. Pertama, ini adalah menjalankan cygwin terbaru, dengan git ditarik dari setup.exe cygwin. Saya menjalankan 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>

Apa yang terjadi disini? Apakah ini masalah terminal, masalah shell, masalah git, atau masalah cygwin?

Pembaruan: Ya, saya menjalankan versi Cygwin git, bukan versi 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
emptyset
sumber
1
Saya menduga masalah terminal. Fakta bahwa kata sandi Anda muncul menunjukkan bahwa terminal tidak dimasukkan dengan benar ke mode diam (di mana tidak menunjukkan karakter yang Anda ketik), dan fakta bahwa teks kata sandi muncul lagi setelah Anda menekan ^Cmenunjukkan bahwa karakter tidak muncul. t dikirim ke stdin dari proses git. Tapi saya tidak tahu apa masalah spesifiknya.
David Z
Terima kasih atas petunjuknya - saya menemukan ini: code.google.com/p/mintty/issues/detail?id=56 - tetapi tidak ada cara untuk menempatkan git dalam mode interaktif seperti python executable ...
emptyset
1
Apakah Anda yakin Anda menggunakan versi git Cygwin? Masalah Mintty 56 hanya berlaku untuk program Windows asli.
ak2
Apakah Anda menemukan solusi untuk masalah ini?
pauldoo

Jawaban:

9

OK, saya pikir saya sudah menemukan solusi yang pasti.

Masalahnya adalah bahwa, terlepas dari terminal yang digunakan (puttycyg, mintty, cmd.exe), Git secara default, dengan tidak adanya alternatif yang lebih baik dikonfigurasi, mencoba menggunakan "prompt kata sandi sederhana" (seperti yang dapat Anda baca dalam deskripsi core.askpass opsi konfigurasi ).

Prompt kata sandi sederhana tampaknya hanya berfungsi pada UNIX yang asli, tetapi tidak pada Cygwin.

Solusinya adalah menginstal program yang kompatibel dengan SSH_ASKPASS untuk Windows dan mengkonfigurasi Git untuk menggunakannya.

Apa yang saya lakukan adalah:

  1. Instal aplikasi win-ssh-askpass dengan membongkar dan menyalin ke C: \
  2. Unduh dan pasang runtime Borland Delphi 5 yang diperlukan oleh win-ssh-askpass (sulit didapat saat ini, tetapi temukan satu di http://www.satsignal.eu/software/runtime.html )
  3. Konfigurasi Git untuk mendapatkan password menggunakan win-ssh-askpass: git config --global core.askpass "C:/win_ssh_askpass.exe". Perhatikan bahwa file EXE memiliki garis bawah pada namanya, bukan tanda minus.
  4. Ingatlah untuk selalu menempatkan login Anda di URL ( https://<user>@<domain>/<repository>). Jika tidak, Git akan meminta login sebelum meminta kata sandi, menggunakan utilitas askpass yang sama. Anda mungkin tanpa sadar memasukkan kata sandi Anda sebagai login, yang akan dikirim ke server web dan login log aksesnya sebagai teks biasa!

Sekarang Git meminta kata sandi menggunakan jendela GUI yang elegan dan berfungsi terlepas dari terminal yang digunakan :)

Aleksander Adamowski
sumber
terima kasih, jalankan secara acak, tetapi jalankan :) Saya tidak tahu mengapa git tidak berjalan seperti yang diharapkan. subversi melakukannya dengan baik.
corretge
1
Saya baru saja menjalankan yang berikut dan muncul gui: git config --global core.askpass "git-gui - askpass" clone
Derek Greer
7

Saya telah mengalami masalah yang sama - namun dalam kasus saya saya SSH di server Cygwin jadi jelas sebuah askpass WinUI GUI tidak akan berfungsi.

Sebagai gantinya, saya menulis skrip sederhana ini untuk melakukan askpass. Saya pikir itu bisa digunakan dari prompt juga dengan mendapatkan perangkat tty dari/bin/tty.exe tetapi itu tidak bekerja untuk alasan yang tidak diketahui (jangan ragu untuk tty diri sendiri atau mencari solusi lain untuk mendapatkan tty, mungkin saya salah entah bagaimana caranya) ).

/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

Pastikan skrip ini dapat dieksekusi dan gunakan sebagai pengaturan core.askpass git Anda. Karena skrip ini bergantung pada variabel $ SSH_TTY, biasanya skrip ini hanya bekerja dari SSH. Namun Anda dapat menetapkan $ SSH_TTY di .bashrcatau .bash_profilejika tidak disetel; dengan cara ini seharusnya bekerja bahkan dari konsol. Baris berikut dalam skrip rc Anda harus melakukannya:

[ -z "$SSH_TTY" ] && export SSH_TTY=$(/bin/tty.exe)
Thomas Guyot-Sionnest
sumber
Saya dapat mengkonfirmasi solusi ini, bekerja dengan sangat baik.
schlamar
Ini juga bekerja dengan baik untuk saya. Namun, saya harus menambahkan arahan ulang (1> & 2) pada pesan "Gagal membuka ..." agar dapat terlihat.
Eric
2

solusi di atas tidak bekerja untuk saya, tetapi saya menemukan yang lain.

Anda harus menjalankan ssh agent

cukup tambahkan ke ~ / .bashrc dan restart konsol

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 dan Opera menggunakan linebreak yang tidak kompatibel dengan bash - cukup gunakan browser lain untuk menyalin salin

Aloy
sumber
1

Mungkin Anda memiliki metacharacter, seperti &, di URL. Ini akan menyebabkan git berjalan di latar belakang, dan pada sistem Unix, ia akan dihentikan begitu ia mencoba membaca dari stdin. A ;juga akan menghentikan perintah setengah jalan melalui garis, dan Ctrl-Cakan menyebabkan sisa baris (perintah terpisah) dibatalkan.

Sangat menarik yang gitmenginisialisasi repo /cygdrive/c/src/project/dev/.git/meskipun Anda menyuruhnya untuk menggunakannya ~/src/project/dev(kecuali Anda memiliki direktori home di tempat yang asing). Ini akan menyarankan bahwa gitperintah tidak melihat sisa baris perintah, yang akan terjadi jika ada yang tersesat &atau ;dalam URL.

(Saya sudah sering mengalami masalah ini wget, meskipun tidak dengan git.)

Coba git clonedari repo yang berbeda, atau gunakan transpor yang berbeda dari repo yang sama, untuk melihat apakah gitberantakan secara umum atau hanya untuk repo ini. Anda juga dapat mencoba menempatkan tanda kutip tunggal di sekitar URL.

Neil Mayhew
sumber
~/srcadalah symlink ke /cygdrive/c/src( C:\src). Tidak ada &di URL. Saya akan mencoba mengkloning repositori git publik, tetapi umumnya mereka tidak akan memiliki kata sandi ...
emptyset
1

Lihatlah masalah berikut - Saya cukup yakin sekarang ini hanya batasan mintty dan interoperabilitas dengan Windows.

Edisi 56 - mintty

Saya juga punya masalah menjalankan mysql dan semacamnya dari mintty - jadi, jawabannya adalah bahwa itu masalah emulasi terminal.

emptyset
sumber
1

Pertanyaan sudah dijawab ... Saya hanya ingin menambahkan cara saya memperbaiki:

Memeriksa Windows Git Bash, saya bisa melihat gitset yang mengikutiSSH_ASKPASS

$ echo $SSH_ASKPASS
/mingw64/libexec/git-core/git-gui--askpass

Jadi, pada Cygwin, saya menambahkan variabel yang sama ke .bashrc

# Unconditionally export SSH_ASKPASS
export SSH_ASKPASS="/mingw64/libexec/git-core/git-gui--askpass"

atau

# export SSH_ASKPASS only if git is installed
hash git 2>/dev/null && export SSH_ASKPASS="/mingw64/libexec/git-core/git-gui--askpass"

Melakukan ini, git membuka SSH_ASKPASS dari Git ... Saya tidak harus menginstal SW tambahan atau membuat skrip tambahan.

Semoga ini bisa membantu!

W0rmH0le
sumber
0

Bertahun-tahun yang lalu saya ingat memiliki beberapa masalah dengan otentikasi CVS Cygwin ... itu berkaitan dengan apakah Anda menginstal Cygwin dengan ujung garis gaya DOS atau Unix (CRLF vs just LF); itu salah satu opsi pada dialog penginstal. Jika Anda memilih yang salah (saya pikir DOS-lah yang berfungsi) kata sandi akan berakhir rusak atau dengan karakter palsu atau sesuatu.

Pokoknya, mungkin ada baiknya mencoba opsi lain.

timday
sumber
0

Saya memiliki masalah yang sama, dan, berlawanan dengan utas ini , masalahnya terjadi dengan Cygwin GIT di semua terminal yang mungkin - puttycyg, minttydan Windows klasik cmd.exe.

Saya masih mencari solusi yang tepat, tetapi ada solusinya - meskipun sangat tidak aman, Anda dapat mencoba menempatkan kata sandi dalam URL repositori, misalnya:

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

Apakah solusinya bekerja untuk Anda?

Aleksander Adamowski
sumber
0

Jika itu repositori yang sering Anda gunakan, hal yang paling mudah adalah membuat file ~ / .netrc

machine git.example.com
login yourlogin
password your password

Tentunya, Anda harus mengatur izin draconian dengan tepat pada file tersebut.

Carson Chittom
sumber
Mengapa tidak menggunakan ssh saja sebagai alat transportasi?
vonbrand
0

Hanya penyempurnaan pada komentar # 2

Ada cygwin ssh-ask-pass (tidak resmi) di sini

Unduh saja tar.bz2 dan bongkar ke folder cygwin Anda. Ini bekerja tanpa menginstal runtime delphi borland.

Raghu
sumber