ฉันจะระบุชื่อผู้ใช้และรหัสผ่านเมื่อเรียกใช้“ git clone git@remote.git” ได้อย่างไร


845

ฉันรู้วิธีระบุชื่อผู้ใช้และรหัสผ่านให้กับคำขอ HTTPS เช่นนี้:

git clone https://username:password@remote

แต่ฉันต้องการทราบวิธีการมอบชื่อผู้ใช้และรหัสผ่านให้กับรีโมตเช่นนี้:

git clone git@remote.git

ฉันลองแบบนี้:

git clone username:password@git@remote.git
git clone git@username:password@remote.git
git clone git@remote.git@username:password

แต่พวกเขาไม่ได้ทำงาน


4
คุณทำไม่ได้ "git" ก่อน "@" เป็นชื่อผู้ใช้แล้ว คุณได้รับที่เก็บ URL จากที่ใด (git@remote.get) คุณได้แนวคิดที่ว่าคุณต้องระบุชื่อผู้ใช้และรหัสผ่านอื่นจากที่ไหน
Ken Thomases

3
URL repos ของฉันมาจาก heroku "git@heroku.com: zxy-helloworld.git" และฉันใช้ emacs shell เพื่อโคลนและดัน หากเชลล์ขอรหัสผ่าน emacs จะหยุดทำงาน นี่เป็นปัญหาที่ทราบกันดีว่า emacs บน Windows: gnu.org/software/emacs/windows/ ......
ประสานงาน

ถ้าชื่อผู้ใช้เป็นอีเมล คุณพิมพ์มันอย่างไร myemail @ gmail.com @ example.com ?
Kyon Perez

คำตอบ:


1318

ตามความคิดเห็นของ Michael Scharf:

คุณสามารถใส่รหัสผ่านเพื่อไม่ให้บันทึกในไฟล์ประวัติ Bash ของคุณ:

git clone https://username@github.com/username/repository.git

มันจะพร้อมท์ให้คุณใส่รหัสผ่าน

หรือคุณอาจใช้:

git clone https://username:password@github.com/username/repository.git

วิธีนี้ใช้ได้กับฉันจากที่เก็บ GitHub


5
มันไม่จำเป็นต้องเหมือนกันโดยวิธี หากเพื่อนร่วมงานของคุณสร้าง repo คอมไพล์และคุณกำลังเข้าสู่บัญชีอื่นพวกเขาจะไม่เหมือนกัน
holgac

49
ไม่แนะนำให้ใส่รหัสผ่านใน URL สำหรับไฟล์นี้จะถูกบันทึกใน. git / config ไม่ปลอดภัยจะดีกว่าถ้าใช้คีย์ ssh
zetanova

55
@MrDuk ไม่มีปัญหาหนีออกมา (เป็น% 40 iirc)
Benjamin Gruenbaum

57
git clone https://username@github.com/username/repository.gitคุณสามารถออกรหัสผ่าน: คอมไพล์จะขอให้คุณและจะไม่ถูกบันทึกไว้ใน .git / config มิได้ในประวัติศาสตร์ทุบตีคุณ
Michael_Scharf

36
คุณสามารถพิมพ์ 'space' ที่จุดเริ่มต้นของบรรทัดเพื่อให้ linux ไม่เก็บคำสั่งในประวัติศาสตร์
Nicolas Zozol

213

user@host:path/to/repoรูปแบบบอก Git การใช้ SSH เพื่อเข้าสู่ระบบด้วยชื่อผู้ใช้host userจากgit help clone:

ไวยากรณ์ที่คล้ายกันของ scp อื่นอาจใช้กับโปรโตคอล ssh:

[user@]host.xz:path/to/repo.git/

ส่วนก่อน@คือชื่อผู้ใช้และวิธีการรับรองความถูกต้อง (รหัสผ่านกุญแจสาธารณะ ฯลฯ ) จะถูกกำหนดโดย ssh ไม่ใช่ Git Git ไม่มีวิธีการส่งรหัสผ่านไปยัง ssh เนื่องจาก ssh อาจไม่ได้ใช้รหัสผ่านขึ้นอยู่กับการกำหนดค่าของเซิร์ฟเวอร์ระยะไกล

ใช้ssh-agentเพื่อหลีกเลี่ยงการพิมพ์รหัสผ่านตลอดเวลา

หากคุณไม่ต้องการที่จะพิมพ์รหัสผ่าน SSH ของคุณตลอดเวลาการแก้ปัญหาโดยทั่วไปคือการสร้างคู่คีย์สาธารณะ / ส่วนตัวใส่กุญแจสาธารณะของคุณใน~/.ssh/authorized_keysแฟ้มssh-agentบนเซิร์ฟเวอร์ระยะไกลและโหลดคีย์ส่วนตัวของคุณลงใน ยังเห็นการกำหนดค่า Git ผ่าน SSH เข้าสู่ระบบครั้งเดียว , หน้าความช่วยเหลือบน GitHub วลีรหัสผ่านที่สำคัญ SSH , เอกสาร SSH gitolite ของและเอกสารคีย์ SSH Heroku ของ

เลือกระหว่างหลายบัญชีที่ GitHub (หรือ Heroku หรือ ... )

หากคุณมีหลายบัญชีในสถานที่เช่น GitHub หรือ Heroku คุณจะมีหลายคีย์ ssh (อย่างน้อยหนึ่งบัญชีต่อบัญชี) ในการเลือกบัญชีที่คุณต้องการเข้าสู่ระบบคุณต้องบอก ssh ว่าจะใช้ไพรเวตคีย์ใด

ตัวอย่างเช่นสมมติว่าคุณมีสองบัญชี GitHub: และfoo barคีย์ SSH สำหรับคุณfooมี~/.ssh/foo_github_idและที่สำคัญ SSH ของคุณสำหรับการมีbar ~/.ssh/bar_github_idคุณต้องการเข้าถึงgit@github.com:foo/foo.gitด้วยfooบัญชีของคุณและgit@github.com:bar/bar.gitด้วยbarบัญชีของคุณ คุณจะเพิ่มสิ่งต่อไปนี้ใน~/.ssh/config:

Host gh-foo
    Hostname github.com
    User git
    IdentityFile ~/.ssh/foo_github_id
Host gh-bar
    Hostname github.com
    User git
    IdentityFile ~/.ssh/bar_github_id

จากนั้นคุณจะโคลนที่เก็บสองรายการดังนี้:

git clone gh-foo:foo/foo.git  # logs in with account foo
git clone gh-bar:bar/bar.git  # logs in with account bar

หลีกเลี่ยง ssh ทั้งหมด

บริการบางอย่างให้การเข้าถึง HTTP เป็นทางเลือกแทน ssh:

  • GitHub:

    https://username:password@github.com/username/repository.git
    
  • Gitorious:

    https://username:password@gitorious.org/project/repository.git
    
  • Heroku: ดูบทความสนับสนุนนี้

คำเตือน : การเพิ่มรหัสผ่านของคุณไปยัง URL โคลนจะทำให้เกิด Git .git/configเก็บรหัสผ่านของคุณในเท็กซ์ ในการจัดเก็บรหัสผ่านของคุณอย่างปลอดภัยเมื่อใช้ HTTP ให้ใช้ตัวช่วยข้อมูลประจำตัว ตัวอย่างเช่น:

git config --global credential.helper cache
git config --global credential.https://github.com.username foo
git clone https://github.com/foo/repository.git

ด้านบนจะทำให้ Git ขอรหัสผ่านของคุณทุกๆ 15 นาที (โดยค่าเริ่มต้น) ดูgit help credentialsรายละเอียดที่


นี่เป็นคำอธิบายที่ดีที่สุดเกี่ยวกับการทำงานของ git กับ SSH ความเข้าใจของฉันคือเมื่อคุณระบุ git@githost.com: path / to / repo.git มันจะบอก git อย่างมีประสิทธิภาพว่าผู้ใช้นั้นเป็น git เองและมันควรจะไปรับข้อมูลประจำตัวของคุณ (กุญแจสาธารณะ) จาก ssh-agent สำหรับ โฮสต์ "githost.com"
Anael

39

ในความคิดเห็นของคำตอบของ @ Bassetassen @plosco กล่าวว่าคุณสามารถใช้git clone https://<token>@github.com/username/repository.gitโคลนจาก GitHub อย่างน้อยที่สุด ฉันคิดว่าฉันจะขยายวิธีการทำเช่นนั้นในกรณีที่มีใครพบคำตอบเช่นฉันในขณะที่พยายามทำการโคลนอัตโนมัติ

GitHub มีคู่มือที่มีประโยชน์มากเกี่ยวกับวิธีการทำเช่นนี้ แต่ไม่ครอบคลุมถึงสิ่งที่ต้องทำหากคุณต้องการรวมไว้ในบรรทัดเดียวเพื่อวัตถุประสงค์อัตโนมัติ มันเตือนว่าการเพิ่มสัญญาณไปยัง URL โคลนจะเก็บไว้ใน plaintext .git/configใน เห็นได้ชัดว่านี่เป็นความเสี่ยงด้านความปลอดภัยสำหรับเกือบทุกกรณีการใช้งาน แต่เนื่องจากฉันวางแผนที่จะลบ repo และยกเลิกโทเค็นเมื่อฉันทำฉันไม่สนใจ

1. สร้างโทเค็น

GitHub มีคู่มือทั้งหมดที่นี่เกี่ยวกับวิธีรับโทเค็น แต่นี่คือ TL; DR

  1. ไปที่การตั้งค่า> การตั้งค่านักพัฒนา> โทเค็นการเข้าถึงส่วนบุคคล ( นี่คือลิงก์โดยตรง )
  2. คลิก "สร้างโทเค็นใหม่" และป้อนรหัสผ่านของคุณอีกครั้ง (h เป็นอีกลิงค์โดยตรง )
  3. ตั้งค่าคำอธิบาย / ชื่อตรวจสอบสิทธิ์ "repo" และกดปุ่ม "สร้างโทเค็น" ที่ด้านล่างของหน้า
  4. คัดลอกโทเค็นใหม่ก่อนออกจากหน้า

2. คัดลอก Repo

เช่นเดียวกับ @plosco คำสั่งให้, git clone https://<token>@github.com/<username>/<repository>.gitเพียงแทนที่<token>, <username>และ<repository>กับสิ่งที่เป็นข้อมูลของคุณ

หากคุณต้องการโคลนมันไปยังโฟลเดอร์ที่ระบุเพียงแค่ใส่ที่อยู่โฟลเดอร์ท้ายที่สุดดังนี้: git clone https://<token>@github.com/<username>/<repository.git> <folder>คุณอยู่ที่ไหน<folder>เดาโฟลเดอร์ที่จะโคลนมัน! แน่นอนคุณสามารถใช้., .., ~ฯลฯ ที่นี่เช่นคุณสามารถอื่น ๆ

3. ปล่อยให้ไม่มีร่องรอย

อาจไม่จำเป็นทั้งหมดขึ้นอยู่กับความละเอียดอ่อนของสิ่งที่คุณทำ

  • คุณอาจไม่ต้องการทิ้งโทเค็นนั้นไว้หากคุณไม่ต้องการใช้มันเป็นระยะเวลาหนึ่งดังนั้นกลับไปที่หน้าโทเค็นแล้วกดปุ่มลบที่อยู่ติดกัน
  • rm -rf <folder>ถ้าคุณไม่จำเป็นต้องซื้อคืนอีกครั้งลบได้
  • ถ้าจำเป็นต้องทำธุรกรรมซื้อคืนอีกครั้ง แต่ไม่จำเป็นต้องได้โดยอัตโนมัติอีกครั้งคุณสามารถลบระยะไกลด้วยการทำหรือเพียงแค่ลบโทเค็นโดยการเรียกใช้git remote remove origingit remote set-url origin https://github.com/<username>/<repository.git>
  • ล้างประวัติทุบตีของคุณเพื่อให้แน่ใจว่าโทเค็นไม่ได้อยู่ที่นั่น มีหลายวิธีในการทำเช่นนี้ดูคำถามนี้และคำถามนี้ อย่างไรก็ตามอาจเป็นการง่ายกว่าที่จะเพิ่มคำสั่งข้างต้นทั้งหมดด้วยช่องว่างเพื่อป้องกันการจัดเก็บเริ่มต้น

โปรดทราบว่าฉันไม่ใช่มืออาชีพดังนั้นข้างต้นอาจไม่ปลอดภัยในแง่ที่ว่าไม่มีร่องรอยเหลือสำหรับงานนิติวิทยาศาสตร์ทุกประเภท


1
https://<token>@github.comไม่เป็นที่ยอมรับกับพอร์ทัลของฉันฉันต้องใช้https://oauth2:<token>@github.com
MushyPeas

25

แม้ว่าจะมีคำตอบมากมาย แต่ตัวฉันเองก็ประสบปัญหาซ้ำ ๆ กันเมื่อชื่อผู้ใช้หรือรหัสผ่านมีอักขระพิเศษอยู่

URL เข้ารหัสชื่อผู้ใช้และรหัสผ่านสำหรับ git จากนั้นใช้เป็นส่วนหนึ่งของ URL เอง (เมื่อไม่มีข้อกังวลด้านความปลอดภัย)

บอกว่าค่าที่เข้ารหัส URL ของชื่อผู้ใช้

'user + 1' คือผู้ใช้% 2B1

และค่าที่เข้ารหัส URL ของรหัสผ่าน

'Welcome @ 1234' คือยินดีต้อนรับ% 401234

จากนั้น GIT Clone URL ของคุณจะเป็นอย่างไร

git clone https://user%2B1:Welcome%401234@actual-git-url-for-the-repo ทำงานอย่างสมบูรณ์แบบในขณะที่

git clone https: // user + 1: ยินดีต้อนรับ @ 1234 @ real-git-url-for-the-repoให้ 403 ข้อผิดพลาด

หวังว่านี่จะช่วยได้

ในกรณีที่ต้องการเข้ารหัส URL ออนไลน์: https://www.urlencoder.org/


13

ฉันแก้ไขปัญหานี้ด้วยวิธีต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่


11
ไม่ควรพิมพ์รหัสผ่านของคุณในบรรทัดคำสั่ง คุณรู้หรือไม่ว่าระบบของคุณอาจเก็บประวัติบรรทัดคำสั่งไว้ในไฟล์ (เช่น: Linux มีไฟล์ที่ซ่อนชื่อ. bash_history)
สิงหาคม

แก้ไข. เมื่อใดก็ตามที่ฉันทำสิ่งนี้หรืออะไรทำนองนี้ซึ่งบางครั้งก็สะดวกมากฉันจะลบคำสั่งที่ฉันใช้จากประวัติ (history -d)
Francesco Marchetti-Stasi

4
@ FrancescoMarchetti-Stasi คุณไม่จำเป็นต้องลบคำสั่งเพียงแค่ใช้ช่องว่างที่จุดเริ่มต้นของคำสั่งและมันจะไม่ถูกเก็บไว้ในประวัติ
Ishtiyaq Husain

ใช่ - ฉันได้เรียนรู้เพียงไม่กี่เดือนที่ผ่านมาหลังจากเกือบ 30 ปีในระบบ Unix ... อัปยศฉัน :)
Francesco Marchetti-Stasi

9

บน Windowsขั้นตอนต่อไปนี้ควรเปิดหน้าต่างการเข้าสู่ระบบ GitHub อีกครั้งเมื่อgit cloneไอเอ็นจี:

  • ค้นหาเมนูเริ่มสำหรับ "ตัวจัดการข้อมูลรับรอง"
  • เลือก "ข้อมูลรับรอง Windows"
  • ลบข้อมูลรับรองที่เกี่ยวข้องกับ Git หรือ GitHub

ผลลัพธ์


7

ทำตามอาร์กิวเมนต์นี้เพื่อแทนที่ด้วยกรณีพิเศษของคุณหากพวกเขากำลังสร้างปัญหา:

! # $ & '() * +, /:; =? @ []

% 21% 23% 24% 26% 27% 28% 29% 2A% 2B% 2C% 2C% 2F% 3A% 3B% 3D% 3F% 40% 5B% 5D

ตัวอย่างเช่น -

URL จริง: https: // usern @ me: p @ ssword @ git / reponame.git

URL โซลูชันที่จะใช้: https: // usern% 40me: p%40ssword@git/reponame.git


5
git config --global core.askpass

เรียกใช้สิ่งนี้ก่อนที่จะทำการโคลนนิ่งแบบเดียวกันควรได้รับการแก้ไข!


3
พยายามที่หนึ่งยังคงไม่ขอมัน
Maarten Kieft

การตั้งค่าคอนฟิเกอเรชันของโลกนั้นไม่ใช่ความคิดที่ดีเพราะมันอาจทำให้โคลนอื่น ๆ
Martin

1

นี่เป็นคำถาม Stack Overflow ที่ยอดเยี่ยมและคำตอบนั้นให้คำแนะนำอย่างมากเช่นฉันสามารถแก้ไขปัญหาที่น่ารำคาญที่ฉันพบเมื่อไม่นานมานี้

องค์กรที่ฉันทำงานเพื่อใช้Atlassian's BitBucketผลิตภัณฑ์ (ไม่ใช่ Github) ซึ่งเป็นรุ่น GitHub หลักของพวกเขาเพื่อให้ที่เก็บสามารถรักษาความปลอดภัยได้อย่างสมบูรณ์บนสมมติฐาน ฉันพบปัญหาคล้ายกันกับ @coordinate ซึ่งฉันต้องการรหัสผ่านสำหรับที่เก็บข้อมูลใหม่ที่ฉันเช็คเอาท์ ข้อมูลประจำตัวของฉันได้รับการบันทึกทั่วโลกสำหรับBitBucketโครงการทั้งหมดดังนั้นฉันไม่แน่ใจว่าสิ่งใดกระตุ้นให้เกิดการสูญเสียข้อมูลรับรอง

กล่าวโดยย่อคือฉันสามารถป้อนคำสั่ง GIT ต่อไปนี้ (ระบุชื่อผู้ใช้ของฉันเท่านั้น ) ซึ่งแจ้งให้ผู้จัดการข้อมูลประจำตัวของ Git แจ้งรหัสผ่านให้ฉันซึ่งฉันสามารถบันทึกได้

git clone https://user@code.domain.org/git/[organization]/[team]/[repository.git]

หมายเหตุ: พา ธ ย่อยของไดเร็กทอรีที่ถูกวงเล็บไว้เพียงอ้างถึงการอ้างอิงภายในและจะแตกต่างกันไปสำหรับคุณ!


0

หากคุณกำลังใช้http/httpsและคุณกำลังมองหากระบวนการอัตโนมัติอย่างเต็มที่โดยไม่ต้องป้อนข้อมูลผู้ใช้หรือแจ้งให้ผู้ใช้เลย (ตัวอย่างเช่น: ภายใน CI / CD ไปป์ไลน์) คุณสามารถใช้วิธีการใช้ประโยชน์ดังต่อไปนี้git credential.helper

GIT_CREDS_PATH="/my/random/path/to/a/git/creds/file"
# Or you may choose to not specify GIT_CREDS_PATH at all.
# See https://git-scm.com/docs/git-credential-store#FILES for the defaults used

git config --global credential.helper "store --file ${GIT_CREDS_PATH}"
echo "https://alice:${ALICE_GITHUB_PASSWORD}@github.com" > ${GIT_CREDS_PATH}

ที่ซึ่งคุณอาจเลือกที่จะตั้งค่าALICE_GITHUB_PASSWORDตัวแปรสภาพแวดล้อมจากคำสั่งเชลล์ก่อนหน้าหรือจากไปป์ไลน์ของคุณเป็นต้น

โปรดจำไว้ว่า "เก็บ" ตาม git-credential-helper จัดเก็บรหัสผ่าน & ค่าในข้อความล้วน ตรวจสอบให้แน่ใจว่าโทเค็น / รหัสผ่านของคุณมีสิทธิ์ จำกัด มาก


ตอนนี้เพียงแค่ใช้https: //alice@github.com/my_repo.gitทุกที่ที่ระบบอัตโนมัติของคุณจำเป็นต้องเรียกคืน repo - มันจะใช้ข้อมูลประจำตัวสำหรับaliceในgithub.comร้านค้าโดย git-credential-helper

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