Cygwin / Git Bizarre Terminal ฉบับที่ออก


16

เอาล่ะนี่มันแปลก ก่อนอื่นนี่คือ mintty ที่ทำงานบน cygwin ที่ทันสมัยโดยมีคอมไพล์ดึงมาจาก setup.exe ของ cygwin ฉันกำลังวิ่งจู่โจม

$ 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แสดงให้เห็นว่าตัวละครศศภอ' ไม่ได้รับการส่งไปยัง stdin ของกระบวนการคอมไพล์ แต่ฉันไม่รู้ว่าปัญหาเฉพาะอาจเป็นอะไร
David Z

ขอบคุณสำหรับคำใบ้ - ฉันเจอสิ่งนี้: code.google.com/p/mintty/issues/detail?id=56 - แต่ไม่มีวิธีใดที่จะนำคอมไพล์มาใช้ในโหมดการโต้ตอบเช่น python executable ...
emptyset

1
คุณแน่ใจหรือว่ากำลังเรียก git ของ Cygwin? ปัญหา Mintty 56 ใช้กับโปรแกรม Windows ดั้งเดิมเท่านั้น
ak2

คุณพบวิธีแก้ไขปัญหานี้หรือไม่?
pauldoo

คำตอบ:


9

ตกลงฉันคิดว่าฉันพบวิธีแก้ปัญหาที่ชัดเจนแล้ว

ปัญหาคือไม่ว่าจะใช้เทอร์มินัลใด (puttycyg, mintty, cmd.exe), Git โดยค่าเริ่มต้นในกรณีที่ไม่มีทางเลือกที่ดีกว่ากำหนดพยายามใช้ "รหัสผ่านง่าย ๆ " (ตามที่คุณสามารถอ่านในคำอธิบายของcore.askpass ตัวเลือกการกำหนดค่า )

เห็นได้ชัดว่ารหัสผ่านง่าย ๆ ใช้งานได้กับ 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 เพื่อขอรับรหัสผ่านที่ใช้ git config --global core.askpass "C:/win_ssh_askpass.exe"win-SSH-askpass: โปรดทราบว่าไฟล์ EXE มีขีดล่างในชื่อไม่ใช่เครื่องหมายลบ
  4. อย่าลืมเสมอวางการเข้าสู่ระบบของคุณใน URL ( https://<user>@<domain>/<repository>) มิฉะนั้น Git จะขอเข้าสู่ระบบก่อนขอรหัสผ่านโดยใช้ยูทิลิตี้ askpass เดียวกัน คุณอาจป้อนรหัสผ่านของคุณโดยไม่ทราบว่าเป็นข้อมูลเข้าสู่ระบบซึ่งจะถูกส่งไปยังเว็บเซิร์ฟเวอร์และเข้าสู่ระบบเข้าสู่ระบบเป็นข้อความธรรมดา!

ตอนนี้ Git ขอรหัสผ่านโดยใช้หน้าต่าง GUI ที่สง่างามและใช้งานได้ไม่ว่าจะใช้เทอร์มินัลใด :)


ขอบคุณวิ่งสุ่ม แต่วิ่ง :) ฉันไม่รู้ว่าทำไม git ถึงไม่ทำงานอย่างที่คาดไว้ การโค่นล้มทำมันได้ดี
corretge

1
ฉันเพิ่งวิ่งต่อไปนี้และมันก็ปรากฏ gui: git config - global core.askpass "git-gui - askpass" clone
Derek Greer

7

ฉันพบปัญหาเดียวกัน - แต่ในกรณีของฉันฉันเป็น SSH'd ในเซิร์ฟเวอร์ Cygwin ดังนั้นเห็นได้ชัดว่า askpass Win32 GUI จะไม่ทำงาน

ฉันเขียนสคริปง่ายๆนี้เพื่อท ฉันว่ามันสามารถใช้งานได้จากการแจ้งเตือนปกติโดยการรับอุปกรณ์ 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

ตรวจสอบให้แน่ใจว่าสคริปต์นี้ทำงานได้และใช้เป็นการตั้งค่า core.askpass ของคอมไพล์ของคุณ เนื่องจากสคริปต์นี้อาศัยตัวแปร $ SSH_TTY โดยปกติแล้วจะใช้งานได้จาก SSH เท่านั้น อย่างไรก็ตามคุณสามารถตั้งค่า $ SSH_TTY ใน.bashrcหรือ.bash_profileถ้าไม่ได้ตั้งค่า; วิธีนี้ควรทำงานได้จากคอนโซล บรรทัดต่อไปนี้ในสคริปต์ rc ของคุณควรทำ:

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

ฉันสามารถยืนยันวิธีนี้ได้ผลดีมาก
schlamar

มันใช้ได้ดีสำหรับฉันเช่นกัน อย่างไรก็ตามฉันต้องเพิ่มการเปลี่ยนเส้นทาง (1> & 2) ในข้อความ "ไม่สามารถเปิด ... " เพื่อให้มองเห็นได้
Eric

2

วิธีแก้ปัญหาด้านบนไม่ได้ผลสำหรับฉัน แต่ฉันพบวิธีอื่น

คุณต้องเรียกใช้ตัวแทนเอสเอส

เพียงเพิ่มใน ~ / .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

อาจเป็นไปได้ว่าคุณมี metacharacter เช่น&ใน URL สิ่งนี้จะทำให้ git ทำงานในพื้นหลังและในระบบ Unix จะหยุดทันทีที่พยายามอ่านจาก stdin A ;จะยกเลิกคำสั่งบางส่วนผ่านทางบรรทัดและCtrl-Cจะทำให้ส่วนที่เหลือของบรรทัด (คำสั่งแยกต่างหาก) ถูกยกเลิก

เป็นเรื่องที่น่าสนใจที่จะgitเริ่มต้น repo /cygdrive/c/src/project/dev/.git/ได้แม้ว่าคุณจะบอกให้ใช้~/src/project/dev(ยกเว้นว่าคุณมีโฮมไดเร็กตอรี่ในที่แปลก ๆ ) สิ่งนี้จะแนะนำว่าgitคำสั่งไม่เห็นส่วนที่เหลือของบรรทัดคำสั่งซึ่งเป็นสิ่งที่จะเกิดขึ้นหากมีการหลงทาง&หรือ;ใน URL

(ฉันเคยมีปัญหานี้หลายครั้งด้วยwgetแม้ว่าจะไม่ได้git)

ลองใช้git cloneจาก repo อื่นหรือใช้การขนส่งที่แตกต่างจาก repo เดียวกันเพื่อดูว่าgitมีความยุ่งเหยิงโดยทั่วไปหรือเพียงแค่สำหรับ repo นี้ คุณสามารถลองใส่ราคาเดียวรอบ URL


~/srcเป็น symlink ไปที่/cygdrive/c/src( C:\src) ไม่มี&ใน URL ฉันจะพยายามโคลนที่เก็บ git สาธารณะ แต่โดยทั่วไปแล้วพวกเขาจะไม่มีรหัสผ่าน ...
emptyset

1

ลองดูที่ปัญหาต่อไปนี้ - ฉันค่อนข้างแน่ใจแล้วในตอนนี้มันเป็นเพียงข้อ จำกัด ของ mintty และการทำงานร่วมกันกับ 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 vs just LF) หรือไม่ เป็นหนึ่งในตัวเลือกในกล่องโต้ตอบตัวติดตั้ง หากคุณเลือกรหัสผิด (ฉันคิดว่า DOS เป็นรหัสที่ใช้งานได้) รหัสผ่านจะถูกทำให้ยุ่งเหยิงหรือมีตัวละครปลอมหรืออะไรบางอย่าง

อย่างไรก็ตามอาจมีค่าลองตัวเลือกอื่น ๆ


0

ฉันมีปัญหาเดียวกันและขัดต่อนี้ด้ายปัญหาเกิดขึ้นกับ Cygwin GIT ในอาคารที่เป็นไปได้ทั้งหมด - puttycyg, และคลาสสิกของ Windowsminttycmd.exe

ฉันยังคงมองหาวิธีการแก้ปัญหาที่เหมาะสม แต่มีวิธีแก้ปัญหา - แม้ว่าจะไม่ปลอดภัยมากคุณสามารถลองวางรหัสผ่านใน URL ที่เก็บเช่น:

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

วิธีแก้ปัญหาใช้สำหรับคุณหรือไม่


0

หากเป็นที่เก็บที่คุณใช้บ่อยสิ่งที่ง่ายที่สุดอาจสร้างไฟล์ ~ / .netrc ด้วย

machine git.example.com
login yourlogin
password your password

เห็นได้ชัดว่าคุณควรกำหนดสิทธิ์ที่เหมาะสมอย่างเข้มงวดในไฟล์


ทำไมไม่ใช้แค่ ssh เป็นพาหนะ?
vonbrand

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.