มีวิธีการแคช GitHub ข้อมูลประจำตัวสำหรับการผลักดันการกระทำหรือไม่?


1867

ฉันเพิ่งเปลี่ยนไปซิงโครไนซ์ที่เก็บข้อมูลของฉันเป็น https: // บน GitHub (เนื่องจากปัญหาไฟร์วอลล์) และมันจะขอรหัสผ่านทุกครั้ง

มีวิธีแคชข้อมูลรับรองแทนการตรวจสอบสิทธิ์ทุกครั้งgit pushหรือไม่



2
ตอนนี้คุณสามารถใช้ผู้ช่วยข้อมูลรับรองเพื่อเข้ารหัส_netrcไฟล์ที่มีข้อมูลรับรองของคุณ ดูคำตอบของฉันด้านล่าง ฉันพบว่าปลอดภัยกว่าgit-credential-winstore.exe(แคชหน่วยความจำ) ซึ่งเป็นบิตรถใน Windows
VonC


git-credential-winstoreทำงานได้ดีที่สุดสำหรับ Windows บั๊กกี้คืออะไร การตั้งค่า ssh เป็นตัวเลือกที่แนะนำแม้ว่าฉันได้ทำไปแล้วหลายครั้งมันเป็นวิธีที่ผิดพลาดมากขึ้นและบางครั้งก็ธรรมดาไม่ทำงานเมื่อคุณต้องเชื่อมต่อกับโฮสต์หลายแห่ง
Bron Davies

2
โดย "ใบรับรอง SSH" ฉันถือว่าคุณหมายถึง "คีย์ส่วนตัว SSH"
Michael Mior

คำตอบ:


2369

ด้วย Git เวอร์ชั่น 1.7.9 ขึ้นไป

ตั้งแต่ Git 1.7.9 (ปล่อยออกมาในช่วงปลายเดือนมกราคม 2012) มีกลไกเรียบร้อยใน Git เพื่อหลีกเลี่ยงการพิมพ์รหัสผ่านของคุณตลอดเวลาสำหรับ HTTP / HTTPS ที่เรียกว่าผู้ช่วยเหลือการรับรอง (ขอบคุณdazonicสำหรับการชี้ให้เห็นคุณลักษณะใหม่นี้ในความคิดเห็นด้านล่าง)

ด้วย Git 1.7.9 หรือใหม่กว่าคุณสามารถใช้หนึ่งในผู้ช่วยเหลือข้อมูลรับรองต่อไปนี้:

git config --global credential.helper cache

... ซึ่งบอกให้ Git เก็บรหัสผ่านของคุณไว้ในหน่วยความจำเป็นเวลา 15 นาที คุณสามารถตั้งค่าการหมดเวลาได้นานขึ้นด้วย:

git config --global credential.helper "cache --timeout=3600"

(แนะนำตัวอย่างนั้นในหน้าช่วยเหลือของ GitHub สำหรับ Linux ) นอกจากนี้คุณยังสามารถจัดเก็บข้อมูลประจำตัวของคุณอย่างถาวรหากต้องการโปรดดูคำตอบอื่น ๆ ด้านล่าง

ความช่วยเหลือของ GitHub ยังแนะนำว่าหากคุณใช้ Mac OS X และใช้Homebrewเพื่อติดตั้ง Git คุณสามารถใช้ที่เก็บคีย์ Mac OS X ดั้งเดิมกับ:

git config --global credential.helper osxkeychain

สำหรับ Windows มีผู้ช่วยที่เรียกว่าGit ตัวจัดการข้อมูลประจำสำหรับ Windowsหรือwincred ใน msysgit

git config --global credential.helper wincred # obsolete

ด้วยGit สำหรับ Windows 2.7.3+ (มีนาคม 2016):

git config --global credential.helper manager

สำหรับ Linux คุณสามารถใช้gnome-keyring (หรือการใช้งานพวงกุญแจอื่น ๆ เช่น KWallet)

ด้วย Git เวอร์ชั่นก่อน 1.7.9

ด้วย Git เวอร์ชัน 1.7.9 ก่อนหน้านี้ตัวเลือกที่ปลอดภัยกว่านี้ไม่พร้อมใช้งานและคุณจะต้องเปลี่ยน URL ที่originรีโมตใช้เพื่อรวมรหัสผ่านในลักษณะนี้:

https://you:password@github.com/you/example.git

... ในคำอื่น ๆ ที่มีหลังจากชื่อผู้ใช้และก่อนที่จะ:password@

คุณสามารถตั้งค่า URL ใหม่สำหรับoriginรีโมทของคุณได้ด้วย:

git config remote.origin.url https://you:password@github.com/you/example.git

ตรวจสอบให้แน่ใจว่าคุณใช้httpsและคุณควรระวังว่าถ้าคุณทำเช่นนี้รหัสผ่าน GitHub ของคุณจะถูกเก็บไว้ในรูปแบบธรรมดาใน.gitไดเรกทอรีของคุณซึ่งเห็นได้ชัดว่าไม่พึงประสงค์

สำหรับทุกรุ่น Git (ตั้งแต่รุ่น 0.99)

อีกวิธีหนึ่งคือการใส่ชื่อผู้ใช้และรหัสผ่านของคุณใน~/.netrcไฟล์ของคุณแม้ว่าเช่นเดียวกับการรักษารหัสผ่านใน URL ระยะไกลซึ่งหมายความว่ารหัสผ่านของคุณจะถูกเก็บไว้ในดิสก์ในข้อความธรรมดาและปลอดภัยน้อยกว่าและไม่แนะนำ อย่างไรก็ตามหากคุณต้องการใช้วิธีการนี้ให้เพิ่มบรรทัดต่อไปนี้ใน~/.netrc:

machine <hostname> login <username> password <password>

... แทนที่<hostname>ด้วยชื่อโฮสต์ของเซิร์ฟเวอร์และ<username>และ<password>ด้วยชื่อผู้ใช้และรหัสผ่านของคุณ อย่าลืมตั้งค่าการอนุญาตระบบไฟล์ที่ จำกัด ของไฟล์นั้น:

chmod 600 ~/.netrc

โปรดทราบว่าใน Windows ไฟล์นี้ควรถูกเรียกใช้_netrcและคุณอาจต้องกำหนดตัวแปรสภาพแวดล้อม% HOME% - สำหรับรายละเอียดเพิ่มเติมดู:


72
อย่าเก็บรหัสผ่านของคุณเป็นข้อความธรรมดา ในฐานะของ Git 1.7.9 คุณสามารถใช้ผู้ช่วยเหลือข้อมูลประจำตัว git config --global credential.helper osxkeychainบน OS X สำหรับระบบปฏิบัติการอื่น ๆ ดูhelp.github.com/articles/set-up-git
dazonic

6
FWIW สิ่งพวงกุญแจ osx เป็นส่วนหนึ่งของซอร์สโค้ด GIT ไม่ใช่ส่วนประกอบพิเศษของ Brew หรือ MacPorts หรืออะไรก็ตามที่รสชาติของเดือนคือ และคุณไม่จำเป็นต้องสร้างคอมไพล์ตั้งแต่เริ่มต้นเลยเพียงแค่ cd contrib / credential / osxkeychain / และ run make
synthesizerpatel

2
ด้วยการตรวจสอบปัจจัยที่สองที่คุณต้องใช้สิ่งที่ GitHub เรียกคนเข้าถึง Token ในความเป็นจริงคุณควรใช้รหัสผ่านเสมอซึ่งแตกต่างจากรหัสผ่านที่คุณสามารถควบคุมการเข้าถึงได้ เพียงแค่เปลี่ยนรหัสผ่านใน url https://username:PERSONAL_ACCESS_TOKEN@github.com/username/project.gitดังนั้นคุณจึงจบลงด้วย มันทำให้รหัสผ่านข้อความธรรมดาที่เก็บไว้ในดิสก์เกือบจะปลอดภัยพอที่จะใช้
Russell Stuart

12
git config --global credential.helper cacheไม่ทำงานบน windows: stackoverflow.com/questions/11693074/…ใช้gitcredentialstoreบน Windows และมีความสุข
Sebastian J.

8
มีวิธีใดที่จะตั้งค่าการหมดเวลานี้เป็นอนันต์?
sudo

720

คุณสามารถให้ Git จัดเก็บข้อมูลประจำตัวของคุณอย่างถาวรโดยใช้สิ่งต่อไปนี้:

git config credential.helper store

หมายเหตุ: แม้ว่าจะสะดวก Git จะจัดเก็บข้อมูลรับรองของคุณเป็นข้อความธรรมดาในไฟล์ท้องถิ่น (.git-credentials) ภายใต้ไดเรกทอรีโครงการของคุณ (ดูด้านล่างสำหรับไดเรกทอรี "home") หากคุณไม่ชอบสิ่งนี้ให้ลบไฟล์นี้แล้วเปลี่ยนไปใช้ตัวเลือกแคช

หากคุณต้องการให้ Git กลับมาขอข้อมูลประจำตัวทุกครั้งที่ต้องการเชื่อมต่อกับที่เก็บระยะไกลคุณสามารถเรียกใช้คำสั่งนี้:

git config --unset credential.helper

ในการจัดเก็บรหัสผ่านในไดเรกทอรี.git-credentialsของคุณ%HOME%ซึ่งตรงข้ามกับไดเรกทอรีโครงการให้ใช้--globalแฟล็ก

git config --global credential.helper store

7
ใน Windows คุณสามารถดาวน์โหลดกำหนดค่าโปรแกรมช่วยเหลือในการจัดเก็บสิ่งที่รุ่นเข้ารหัสรหัสผ่านของคุณ GIT ในโฟลเดอร์ Windows Creditial ร้านดูconfluence.atlassian.com/display/STASH/...
Contango

76
ฉันพบว่าฉันต้องระบุ --global หรือจะพยายามเก็บการตั้งค่าในพื้นที่เก็บข้อมูลปัจจุบัน:git config --global credential.helper store
Brian Gordon

6
ทำไมแคชแทนที่จะเก็บอย่างถาวร? แชร์คอมพิวเตอร์หรืออะไร
Michael J. Calkins

2
@BrianGordon ฉันใช้ GIT 1.9.5 บน Windows และการ--globalตั้งค่าสถานะซ้ำซ้อน แม้ไม่มีแฟล็กนี้ไฟล์หนังสือรับรองจะถูกสร้างใน%USER_HOME%ไดเร็กทอรี
jFrenetic

2
หากไม่จัดเก็บเป็นข้อความธรรมดามันจะป้องกันอะไร รหัสผ่านของคุณ? มันจะไม่ต้องถามรหัสผ่านผู้ดูแลระบบของคุณเมื่อคุณเชื่อมต่อกับคอมไพล์? ไม่ต้องป้อนรหัสผ่านเพื่อรับรหัสผ่านแปลก ๆ อีกนิดหรือ
Cruncher

101

TLDR; ใช้ไฟล์ Netrc เข้ารหัสด้วย Git 1.8.3+

การบันทึกรหัสผ่านสำหรับ HTTPS ที่เก็บ Git เป็นไปได้ด้วย ~/.netrc (Unix) หรือ%HOME%/_netrc(หมายเหตุ_) บน Windows

แต่ : ไฟล์นั้นจะเก็บรหัสผ่านของคุณเป็นข้อความธรรมดา

วิธีแก้ไข : เข้ารหัสไฟล์นั้นด้วยGPG (GNU Privacy Guard)และทำให้ Git ถอดรหัสมันทุกครั้งที่ต้องการรหัสผ่าน (สำหรับpush/ pull/ fetch/ cloneการทำงาน)


หมายเหตุ: ด้วย Git 2.18 (Q2 2018) ตอนนี้คุณสามารถปรับแต่ง GPG ที่ใช้ในการถอดรหัส.netrcไฟล์ที่เข้ารหัส

ดูกระทำ 786ef50 , กระทำ f07eeed (12 พฤษภาคม 2018) โดยหลุยส์ Marsano ( ``)
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 017b7c5 , 30 พฤษภาคม 2018)

git-credential-netrc: ยอมรับgpgตัวเลือก

git-credential-netrcถูก hardcoded เพื่อถอดรหัสด้วย ' gpg' โดยไม่คำนึงถึงตัวเลือก gpg.program
นี่เป็นปัญหาของการแจกแจงอย่าง Debian ที่เรียก GnuPG ที่ทันสมัยอย่างอื่นเช่น ' gpg2'


คำแนะนำทีละขั้นตอนสำหรับ Windows

ด้วย Windows:

(Git มีการgpg.exeแจกจ่าย แต่ใช้การติดตั้ง GPG แบบเต็มซึ่งรวมถึง a gpg-agent.exeซึ่งจะจดจำข้อความรหัสผ่านของคุณที่เกี่ยวข้องกับคีย์ GPG ของคุณ)

  • ติดตั้งgpg4Win Liteอินเตอร์เฟสบรรทัดคำสั่ง gnupg ขั้นต่ำ (รับล่าสุดgpg4win-vanilla-2.X.Y-betaZZ.exe ) และทำ PATH ของคุณให้สมบูรณ์ด้วยไดเรกทอรีการติดตั้ง GPG:

    set PATH=%PATH%:C:\path\to\gpg
    copy C:\path\to\gpg\gpg2.exe C:\path\to\gpg\gpg.exe

(หมายเหตุcopyคำสั่ง '': Git จะต้องใช้ Bash script เพื่อเรียกใช้งานคำสั่ง ' gpg' เนื่องจากgpg4win-vanilla-2มาพร้อมกับgpg2.exeคุณต้องทำซ้ำ)

  • สร้างหรือนำเข้าคีย์ GPG และเชื่อถือได้:

    gpgp --import aKey
    # or
    gpg --gen-key

(ตรวจสอบให้แน่ใจว่าใส่ข้อความรหัสผ่านไปที่คีย์นั้น)

  • เชื่อใจกุญแจนั้น

  • ติดตั้งสคริปต์ผู้ช่วยข้อมูลรับรองในไดเรกทอรีภายใน%PATH%:

    cd c:\a\fodler\in\your\path
    curl -o c:\prgs\bin\git-credential-netrc https://raw.githubusercontent.com/git/git/master/contrib/credential/netrc/git-credential-netrc.perl

(ระวัง: สคริปต์ถูกเปลี่ยนชื่อใน Git 2.25.x / 2.26 ดูด้านล่าง)

(ใช่นี่คือสคริปต์ Bash แต่จะทำงานบน Windows เนื่องจาก Git จะถูกเรียก)

  • ทำไฟล์ _netrc เป็นข้อความธรรมดา

    machine a_server.corp.com
    login a_login
    password a_password
    protocol https
    
    machine a_server2.corp.com
    login a_login2
    password a_password2
    protocol https

(อย่าลืมส่วน ' protocol': ' http' หรือ 'https ' ทั้งนี้ขึ้นอยู่กับ URL ที่คุณจะใช้)

  • เข้ารหัสไฟล์นั้น:

    gpg -e -r a_recipient _netrc

(ขณะนี้คุณสามารถลบ_netrcไฟล์, การรักษาเท่านั้น_netrc.gpgหนึ่งเข้ารหัส.)

  • ใช้ไฟล์ที่เข้ารหัส:

    git config --local credential.helper "netrc -f C:/path/to/_netrc.gpg -v"

(หมายเหตุ ' /': C:\path\to...จะไม่ทำงานเลย) (คุณสามารถใช้งานได้ในตอนแรก-v -dเพื่อดูว่าเกิดอะไรขึ้น)

นับจากนี้ไปคำสั่ง Git ใด ๆ ที่ใช้ HTTP (S) URL ที่ต้องมีการตรวจสอบความถูกต้องจะถอดรหัส_netrc.gpgไฟล์นั้นและใช้เข้าสู่ระบบ / รหัสผ่านที่เกี่ยวข้องกับเซิร์ฟเวอร์ที่คุณกำลังติดต่อ ครั้งแรกที่ GPG จะขอให้คุณใส่รหัสผ่านของคีย์ GPG ของคุณเพื่อถอดรหัสไฟล์ ในเวลาอื่น ๆ ตัวแทน gpg เปิดตัวโดยอัตโนมัติโดยการโทร GPG แรกจะให้ข้อความรหัสผ่านนั้นสำหรับคุณ

วิธีการที่คุณสามารถจดจำหลาย URL ที่ / การเข้าสู่ระบบ / รหัสผ่านในไฟล์เดียวและมีมันเก็บไว้ในฮาร์ดดิสก์ของคุณมีการเข้ารหัส
ฉันคิดว่าสะดวกกว่าตัวช่วย "แคช" ที่คุณต้องจำและพิมพ์ (หนึ่งครั้งต่อเซสชัน) รหัสผ่านที่แตกต่างกันสำหรับแต่ละบริการระยะไกลของคุณสำหรับรหัสผ่านดังกล่าวจะถูกเก็บไว้ในหน่วยความจำ


ด้วย Git 2.26 (Q1 2020) ตัวช่วยข้อมูลรับรองตัวอย่างสำหรับการใช้งาน.netrcได้รับการอัปเดตให้ทำงานนอกกรอบ ดูแพทช์ / การสนทนาแพทช์

ดูกระทำ 6579d93 , กระทำ 1c78c78 (20 ธันวาคม 2019) โดยDenton หลิว (Denton-L )
(ผสานโดยJunio ​​C Hamano - gitster- in 1fd27f8 , 25 Dec 2019)

contrib/credential/netrc: ทำ PERL_PATHกำหนดค่าได้

ลงชื่อออกโดย: Denton Liu

เส้นทาง shebang สำหรับล่ามภาษา Perl git-credential-netrcนั้นถูกฮาร์ดโค้ด
อย่างไรก็ตามผู้ใช้บางคนอาจอยู่ในตำแหน่งอื่นและจะต้องแก้ไขสคริปต์ด้วยตนเอง

เพิ่ม.perlคำนำหน้าให้กับสคริปต์เพื่อแสดงว่าเป็นเทมเพลตและไม่สนใจเวอร์ชันที่สร้างขึ้น
เพิ่มMakefileเพื่อให้มันสร้างgit-credential-netrcจากgit-credential-netrc.perlเช่นเดียวกับสคริปต์ Perl อื่น ๆ

สูตร Makefile contrib/mw-to-git/Makefileถูกขโมยลงคอจาก

และ:

ด้วย 2.26 (ไตรมาสที่ 1 ปี 2020) ผู้ช่วยข้อมูลรับรองตัวอย่างสำหรับการใช้. netrc ได้รับการอัปเดตให้ทำงานนอกกรอบ

ดูกระทำ 6579d93 , กระทำ 1c78c78 (20 ธันวาคม 2019) โดยDenton หลิว (Denton-L )
(ผสานโดยJunio ​​C Hamano - gitster- in 1fd27f8 , 25 Dec 2019)

contrib/credential/netrc: ทำงานนอก repo

ลงชื่อออกโดย: Denton Liu

ปัจจุบันgit-credential-netrcไม่สามารถใช้งานได้นอกพื้นที่เก็บข้อมูลคอมไพล์ มันล้มเหลวด้วยข้อผิดพลาดดังต่อไปนี้:

fatal: Not a git repository: . at /usr/share/perl5/Git.pm line 214.

ไม่มีเหตุผลที่แท้จริงว่าทำไมต้องอยู่ในพื้นที่เก็บข้อมูล ผู้ช่วยหนังสือรับรองควรสามารถทำงานได้ดีนอกพื้นที่เก็บข้อมูลเช่นกัน

เรียกใช้เวอร์ชันที่ไม่ใช่ของตัวเองconfig()เพื่อgit-credential-netrcไม่จำเป็นต้องรันในที่เก็บอีกต่อไป

Jeff King ( peff)เพิ่ม:

ฉันคิดว่าคุณกำลังใช้การเข้ารหัส gpg netrc(ถ้าไม่ใช่คุณน่าจะใช้credential-store)
สำหรับการเข้าถึงรหัสผ่าน "อ่านอย่างเดียว" ฉันพบว่าการรวมกันของการตั้งค่าpassเช่นนี้เป็นบิตที่ดีกว่า:

[credential "https://github.com"]
  username = peff
  helper = "!f() { test $1 = get && echo password=`pass github/oauth`; }; f"

1
ลองสิ่งเดียวกันบน linux .. git config --local credential.helper "netrc -f /home/me/.netrc.gpg -v -d" .. และฉันได้รับ "git: 'credential-netrc' ไม่ใช่ คำสั่ง git ดู 'git --help' "
sunny

4
@sunny นั่นคือสิ่งที่curl -o c:\prgs\bin\git-credential-netrc https://raw.github.com/git/git/master/contrib/credential/netrc/git-credential-netrcมีไว้สำหรับ: คุณต้องคัดลอกที่git-credential-netrcใดก็ได้ในเส้นทางของคุณ ( $PATH) เพื่อให้ git สามารถเรียก ' credential-netrc' ได้
VonC

เอาละใช้_netrcไม่ได้กับฉันบนWindows 7PC แต่ใช้.netrcกับyoutube-dlด้วยการ--netrcทะเลาะกัน
Iulian Onofrei

@VonC ดูเหมือน URL ปัจจุบันจะเป็นhttps://raw.githubusercontent.com/git/git/master/contrib/credential/netrc/git-credential-netrc.perl(ท่อในเจ็ดปีต่อมา
Gwyneth Llewelyn

1
@GwynethLlewelyn ขอบคุณ ฉันได้แก้ไขคำตอบแล้ว อย่าลังเลที่จะแก้ไขด้วยตัวคุณเองหากคุณเห็นข้อมูลล้าสมัยอื่น ๆ
VonC

43

มีวิธีที่ง่ายและล้าสมัยในการจัดเก็บข้อมูลรับรองผู้ใช้ใน HTTPS URL:

https://user:password@github.com/...

คุณสามารถเปลี่ยน URL ได้ด้วย git remote set-url <remote-repo> <URL>

ข้อเสียที่ชัดเจนของวิธีการนั้นคือคุณต้องเก็บรหัสผ่านเป็นข้อความธรรมดา คุณยังสามารถป้อนชื่อผู้ใช้ได้ (https://user@github.com/... ) ซึ่งอย่างน้อยจะช่วยให้คุณไม่ต้องยุ่งยากอีกต่อไป

คุณอาจต้องการเปลี่ยนไปใช้ SSH หรือใช้ซอฟต์แวร์ไคลเอ็นต์ GitHub


2
อาจต้องมีการเข้ารหัสชื่อผู้ใช้ / รหัสผ่านดูstackoverflow.com/a/34611311/3906760
MrTux

43

ใช้ที่เก็บข้อมูลรับรอง

สำหรับ Git 2.11+ บนOS XและLinuxให้ใช้ที่จัดเก็บหนังสือรับรองในตัวของ Git :

git config --global credential.helper libsecret

สำหรับ msysgit 1.7.9+ บนWindows :

git config --global credential.helper wincred

สำหรับ Git 1.7.9+ บน OS X ให้ใช้:

git config --global credential.helper osxkeychain

2
ฉันแน่ใจว่านี่เป็นวิธีที่จะไป แต่ฉันได้รับข้อผิดพลาดอย่างน่าเศร้า:git: 'credential-gnome-keyring' is not a git command. See 'git --help'.
codepleb

1
ขอบคุณ แต่ฉันได้รับข้อผิดพลาดเดียวกันอย่างใด ฉันกำลังทำอะไรผิดหรือเปล่า? ฉันพิมพ์คำสั่งและไม่มีอะไรเกิดขึ้น ทันทีที่ฉันกดฉันจะขอข้อมูลประจำตัวที่ฉันใส่สำเร็จ แต่ฉันได้รับข้อผิดพลาดว่าไม่ใช่คำสั่ง git หลังจากทำเช่นนั้น
codepleb

2
ก่อนที่ libsecret จะทำงานบน Linux คุณต้องทำตามขั้นตอนเหล่านี้: stackoverflow.com/a/40312117/775800
Lavamantis

1
อีกอย่างหนึ่ง - ถ้าคุณเปิดใช้งาน 2FA บน Github รหัสผ่านของคุณจะไม่ทำงาน แต่คุณสามารถสร้างโทเค็นการเข้าถึงส่วนบุคคลในหน้า "การตั้งค่า" Github ของคุณและโทเค็นนั้นใช้เป็นรหัสผ่านของคุณ github.com/github/hub/issues/822
Lavamantis

3
ปัญหาด้านความปลอดภัย:ตัวจัดการข้อมูลรับรองของ Windows ทำให้ใครก็ตามที่ลงชื่อเข้าใช้บัญชี Windows ของคุณสามารถเข้าถึงรหัสผ่านแบบธรรมดาได้ สิ่งที่พวกเขาต้องทำคือส่งคำขอไปยังผู้จัดการข้อมูลรับรองเช่นprintf "protocol=https\nhost=git.mycompany.com\n" | git credential-manager get( รายละเอียดเพิ่มเติมที่นี่ ) คุณควรใช้โทเค็นการเข้าถึงส่วนบุคคลเสมอกับสิ่งนี้และแน่นอนว่าใช้ 2FA ในบัญชี GitHub ของคุณ
cjs

40

คุณสามารถใช้

git config credential.helper store

เมื่อคุณป้อนรหัสผ่านในครั้งถัดไปด้วยการดึงหรือกดรหัสผ่านจะถูกเก็บไว้ในไฟล์. git-credentials เป็นข้อความธรรมดา (ไม่ปลอดภัยเล็กน้อย แต่เพียงใส่ไว้ในโฟลเดอร์ที่มีการป้องกัน)

และนั่นคือมันตามที่ระบุไว้ในหน้านี้:

git-credential-store


3
สำหรับ Git สำหรับ Windows 2.7.3 (มีนาคม 2016): github.com/git-for-windows/git/releases?after=v2.8.4.windows.1ซึ่งจะเป็นgit config credential.helper managerแทน
VonC

23

ฉันไม่เห็นได้ชัดเลยว่าฉันต้องดาวน์โหลดตัวช่วยก่อน! ฉันพบการดาวน์โหลดหนังสือรับรองผู้ช่วยที่Atlassian อย่างถาวรรับรองกับที่เก็บ Gitถาวรตรวจสอบกับเก็บ

อ้างถึง:

ทำตามขั้นตอนเหล่านี้หากคุณต้องการใช้ Git ด้วยการแคชหนังสือรับรองบน ​​OS X:

ดาวน์โหลดไบนารี่ git-credential-osxkeychain

เรียกใช้คำสั่งด้านล่างเพื่อให้แน่ใจว่าไบนารีนั้นทำงานได้:

chmod a+x git-credential-osxkeychain

วางไว้ในไดเรกทอรี /usr/local/binวางไว้ในไดเรกทอรี

เรียกใช้คำสั่งด้านล่าง:

git config --global credential.helper osxkeychain

23

เพียงรวมข้อมูลรับรองการเข้าสู่ระบบเป็นส่วนหนึ่งของ URL:

git remote rm origin
git remote add origin https://username:mypassword@github.com/path/to/repo.git

หมายเหตุ: ฉันไม่แนะนำวิธีนี้ แต่ถ้าคุณรีบเร่งและไม่มีอะไรทำงานได้คุณสามารถใช้วิธีนี้ได้


12
มันจะทำงานได้โดยที่คุณต้องหลบหนี @ ด้วย% 40 ในรหัสอีเมลของคุณ
Tarun Gupta

ถ้าเรามี '+' ในรหัสอีเมลล่ะ ฉันพยายามหลบหนีแบบเดิม แต่การกดพูดว่า 'ไม่พบ repo'
killjoy

4
มี% 2B แทน +
Tarun Gupta

การจัดเก็บรหัสผ่านเป็นข้อความธรรมดาและเข้าถึงได้ง่ายอาจไม่ใช่โซลูชันที่ดีที่สุด
กิจกรรมลด

20

ในการตั้งค่า GNU / Linux a ~ / .netrc ก็ทำงานได้ดีเช่นกัน:

$ cat ~/.netrc
machine github.com login lot105 password howsyafather

มันอาจขึ้นอยู่กับว่าไลบรารีเครือข่ายใดที่ Git ใช้สำหรับการขนส่งHTTPS


4
ตรวจสอบให้แน่ใจchmod 0600 ~/.netrcด้วย
poolie

เพียงแค่ต้องการที่จะออกจากการเชื่อมโยงที่นี่กับอูบุนตู Netrc manpage ฉันต้องการสร้างมันสำหรับผู้ใช้รายอื่น (/home/git/.netrc) จากนั้นเปลี่ยนความเป็นเจ้าของให้กับผู้ใช้รายนั้น
zacharydl

17

สำหรับ Windows คุณสามารถใช้Git Credential Managerปลั๊กอิน (GCM) ขณะนี้ Microsoft ได้รับการบำรุงรักษา สิ่งที่ดีคือมันบันทึกรหัสผ่านใน Windows Credential Store ไม่ใช่ข้อความธรรมดา

มีตัวติดตั้งในหน้าเผยแพร่ของโครงการ สิ่งนี้จะติดตั้งGit สำหรับ Windowsรุ่นเป็นทางการพร้อมกับตัวจัดการข้อมูลประจำตัว อนุญาตการตรวจสอบสิทธิ์แบบสองปัจจัยสำหรับ GitHub (และเซิร์ฟเวอร์อื่น ๆ ) และมีส่วนต่อประสานกราฟิกสำหรับการเริ่มต้นเข้าสู่ระบบ

สำหรับผู้ใช้ Cygwin (หรือผู้ใช้ที่ใช้ Git อย่างเป็นทางการสำหรับ Windows อยู่แล้ว) คุณอาจต้องการติดตั้งด้วยตนเอง ดาวน์โหลดแพคเกจซิปจากหน้าเผยแพร่ แตกแพคเกจแล้วเรียกใช้install.cmdไฟล์ สิ่งนี้จะติดตั้งใน~/binโฟลเดอร์ของคุณ (ให้แน่ใจว่า~/binไดเรกทอรีของคุณอยู่ในเส้นทางของคุณ) จากนั้นคุณกำหนดค่าโดยใช้คำสั่งนี้:

git config --global credential.helper manager

Git จะทำงานgit-credential-manager.exeเมื่อตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ใด ๆ


3
ใครก็ตามที่ลงชื่อเข้าใช้บัญชีของคุณจะสามารถเข้าถึงรหัสผ่านได้อย่างง่ายดาย สิ่งที่พวกเขาต้องทำคือส่งคำขอไปยังผู้จัดการข้อมูลรับรองเช่นprintf "protocol=https\nhost=git.mycompany.com\n" | git credential-manager get( รายละเอียดเพิ่มเติมที่นี่ ) คุณควรใช้โทเค็นการเข้าถึงส่วนบุคคลเสมอกับสิ่งนี้และแน่นอนว่าใช้ 2FA ในบัญชี GitHub ของคุณ
cjs

13

หากคุณไม่ต้องการที่จะเก็บรหัสผ่านของคุณในรูปแบบธรรมดาอย่าง Mark กล่าวคุณสามารถใช้ GitHub URL อื่นเพื่อดึงข้อมูลได้มากกว่าที่คุณกด ในไฟล์กำหนดค่าของคุณภายใต้[remote "origin"]:

url = git://github.com/you/projectName.git
pushurl = git@github.com:you/projectName.git

มันจะยังคงถามรหัสผ่านเมื่อคุณกด แต่ไม่ใช่เมื่อคุณดึงข้อมูลอย่างน้อยสำหรับโครงการโอเพ่นซอร์ส


12

OAuth

คุณสามารถสร้างตัวเองของคุณโทเค็น API ส่วนบุคคล ( OAuth ) และใช้วิธีเดียวกับที่คุณจะใช้ข้อมูลประจำตัวตามปกติของคุณ (ที่: /settings/tokens) ตัวอย่างเช่น:

git remote add fork https://4UTHT0KEN@github.com/foo/bar
git push fork

.netrc

อีกวิธีคือการกำหนดค่าผู้ใช้ / รหัสผ่านใน~/.netrc( _netrcบน Windows) เช่น

machine github.com
login USERNAME
password PASSWORD

สำหรับ HTTPS เพิ่มบรรทัดพิเศษ:

protocol https

ผู้ช่วยข้อมูลรับรอง

ในการแคชรหัสผ่าน GitHub ของคุณใน Gitเมื่อใช้ HTTPS คุณสามารถใช้ผู้ช่วยข้อมูลประจำตัวเพื่อบอก Git ให้จดจำชื่อผู้ใช้และรหัสผ่าน GitHub ทุกครั้งที่พูดถึง GitHub

  • Mac: git config --global credential.helper osxkeychain( osxkeychain helperจำเป็น)
  • ของ windows: git config --global credential.helper wincred
  • Linux และอื่น ๆ : git config --global credential.helper cache

ที่เกี่ยวข้อง:


10

คุณสามารถใช้ผู้ช่วยข้อมูลรับรอง

git config --global credential.helper 'cache --timeout=x'

โดยที่xจำนวนวินาที


7
มันคือจำนวนวินาที ... อัจฉริยะบางคนอัพเดทเป็นมิลลิวินาทีและทุกคนอนุมัติโดยไม่ตรวจสอบ โปรดอย่าทำให้คนเข้าใจผิดถ้าคุณไม่รู้คำตอบ ขอบคุณ!
Charan

คุณสามารถให้เชื่อมโยงไปยังสถานที่ที่หนึ่งstore, cacheและสิ่งอื่น ๆ ทั่วไปมีการระบุไว้และอธิบาย?
Notinlist

3
สนใจที่จะพูดถึงความจริงที่ว่าแจ็คนี้ไม่ได้นอกจากคุณจะเรียกคำสั่งเฉพาะอื่นเพื่อใช้ 'แคช' เป็นผู้จัดการก่อนหรือไม่ สิ่งนี้เป็นความลับดังนั้นคำตอบเหล่านี้ทั้งหมดไม่สมบูรณ์และไม่มีคำตอบใด ๆ น่าผิดหวังอย่างไม่น่าเชื่อ ดูสิ่งนี้แทน: stackoverflow.com/a/24800870/88409
Triynko

10

หลังจากที่คุณโคลนที่เก็บrepoคุณสามารถแก้ไขrepo/.git/configและเพิ่มการกำหนดค่าบางอย่างดังนี้:

[user]
    name = you_name
    password = you_password
[credential]
    helper = store

แล้วคุณจะไม่ได้รับการถามusernameและpasswordอีกครั้ง


ใช้งานได้สำหรับฉันด้วยhelper = manager(แต่ฉันขอชื่อผู้ใช้ + repo สำหรับการกดครั้งแรก)
Stéphane Laurent

กับผู้ช่วยผู้จัดการ = ฉันได้รับข้อผิดพลาดข้อมูลประจำตัวผู้จัดการไม่ได้เป็นคำสั่งคอมไพล์
พิล

น่าเสียดายที่ git ไม่สนใจรหัสผ่านในไฟล์ปรับแต่ง .git_credentials ที่มีหนังสือรับรองเป็นเพียงตัวเลือกเดียว
Avamander

9

ฉันรู้ว่านี่ไม่ใช่วิธีแก้ปัญหาที่ปลอดภัย แต่บางครั้งคุณต้องการเพียงโซลูชันง่ายๆ - โดยไม่ต้องติดตั้งอะไรเลย และเนื่องจากตัวช่วย = storeไม่ทำงานสำหรับฉันฉันจึงสร้างตัวช่วยจำลอง:

สร้างสคริปต์และวางไว้ในโฟลเดอร์ bin ผู้ใช้ของคุณที่นี่ชื่อcredfakeสคริปต์นี้จะให้ชื่อผู้ใช้และรหัสผ่านของคุณ:

#!/bin/bash
while read line
do
  echo "$line"
done < "/dev/stdin"
echo username=mahuser
echo password=MahSecret12345

ทำให้ปฏิบัติการ:

chmod u+x /home/mahuser/bin/credfake

จากนั้นกำหนดค่าด้วย git:

git config --global credential.helper /home/mahuser/bin/credfake

(หรือใช้โดยไม่มี - global สำหรับ repo หนึ่งเท่านั้น)

และ - voilá - git จะใช้ชื่อผู้ใช้และรหัสผ่านนี้


ฉันเห็นด้วย. ทางออกที่ง่าย (ถ้าไม่ปลอดภัย) แน่นอน +1 ตราบเท่าที่คุณรู้ว่าคุณกำลังทำอะไร
VonC

7

ควรใช้โทเค็นการตรวจสอบสิทธิ์แทนรหัสผ่านบัญชี ไปที่การตั้งค่า / แอปพลิเคชัน GitHub จากนั้นสร้างโทเค็นการเข้าถึงส่วนบุคคล โทเค็นสามารถใช้ได้เช่นเดียวกับที่ใช้รหัสผ่าน

โทเค็นมีวัตถุประสงค์เพื่อให้ผู้ใช้ที่ไม่ได้ใช้รหัสผ่านบัญชีสำหรับงานโครงการ ใช้รหัสผ่านเฉพาะเมื่อทำงานด้านการบริหารเช่นสร้างโทเค็นใหม่หรือเพิกถอนโทเค็นเก่า


แทนที่จะใช้โทเค็นหรือรหัสผ่านที่ให้สิทธิ์ผู้ใช้ในการเข้าถึงบัญชี GitHub คุณสามารถใช้คีย์การปรับใช้เฉพาะโครงการเพื่อให้สามารถเข้าถึงที่เก็บโครงการเดียว คุณสามารถกำหนดค่าโครงการ Git ให้ใช้คีย์ที่แตกต่างกันนี้ในขั้นตอนต่อไปนี้เมื่อคุณยังสามารถเข้าถึงบัญชี Git หรือโครงการอื่น ๆ ด้วยข้อมูลประจำตัวของคุณ:

  1. เขียนไฟล์การกำหนดค่า SSH ที่มีHost, IdentityFileสำหรับคีย์การปรับใช้, บางทีUserKnownHostsFile, และอาจจะUser(แม้ว่าฉันคิดว่าคุณไม่ต้องการมัน)
  2. เขียนสคริปต์เชลล์ wrapper SSH ที่เป็นจริง ssh -F /path/to/your/config $*
  3. เติมGIT_SSH=/path/to/your/wrapperหน้าคำสั่ง Git ปกติของคุณ ที่นี่git remote (ต้นกำเนิด) ต้องใช้git@github.com:user/project.gitรูปแบบ

7

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

git config --global credential.helper cache
git config credential.helper 'cache --timeout=3600'

ข้อมูลรับรองของคุณจะถูกบันทึกเป็นเวลา 3600 วินาที


หมายความว่าหลังจาก 3600 วินาทีเราต้องใส่รหัสผ่านอีกครั้ง ??? จะบันทึกอย่างถาวรได้อย่างไร
HoangVu

$ git config credential.helper 'cache --timeout = 3600' ข้อผิดพลาด: ไม่สามารถล็อคไฟล์ config. git / config: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
PlantationGator

สิ่งนี้ทำงานได้: git config --global credential.helper 'cache --timeout = 3600'
PlantationGator

@ ทามาฉันรู้ว่ามันผ่านมาสามปีแล้ว แต่คุณสามารถละทิ้ง--timeoutและข้อมูลประจำตัวจะถูกเก็บไว้ตลอดไป
Neil Chowdhury

สิ่งนี้จะทำงานภายในคอนเทนเนอร์ Docker windowsservercoreหรือไม่(ขึ้นอยู่กับ)
Peter Mortensen

5

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

หากคุณใช้การรับรองความถูกต้องด้วยสองปัจจัยดังนั้นการระบุชื่อผู้ใช้ / รหัสผ่านจะไม่สามารถใช้งานได้ - คุณจะไม่สามารถเข้าถึงได้ แต่คุณสามารถใช้โทเค็นการเข้าถึงแอปพลิเคชันและใช้ตัวช่วยข้อมูลประจำตัวของ Git เพื่อแคชสำหรับคุณ นี่คือลิงค์ที่เกี่ยวข้อง:

และฉันจำไม่ได้ว่าฉันเห็นสิ่งนี้อยู่ที่ไหน แต่เมื่อคุณถามชื่อผู้ใช้ของคุณ - นั่นคือสิ่งที่คุณติดโทเค็นการเข้าถึงแอปพลิเคชัน จากนั้นปล่อยรหัสผ่านว่างเปล่า มันทำงานบน Mac ของฉัน


เมื่อใช้การพิสูจน์ตัวตนแบบ 2 ทางคุณใช้ "access token" เป็นรหัสผ่าน ชื่อผู้ใช้ยังคงเหมือนเดิม
Ben Yitzhaki


4

โดยปกติคุณจะมี URL ระยะไกลสิ่งนี้

git remote -v

origin    https://gitlab.com/username/Repo.git (fetch)
origin    https://gitlab.com/username/Repo.git (push)

หากคุณต้องการข้ามชื่อผู้ใช้และรหัสผ่านขณะใช้git pushงานให้ลองทำดังนี้:

 git remote set-url origin https://username:password@gitlab.com/username/Repo.git

ฉันเพิ่งเพิ่ม URL เดียวกัน (พร้อมรายละเอียดผู้ใช้รวมถึงรหัสผ่าน) ไปที่จุดเริ่มต้น

หมายเหตุ:มันไม่ทำงานหากชื่อผู้ใช้เป็นรหัสอีเมล

git remote -v

origin    https://username:password@gitlab.com/username/Repo.git (fetch)
origin    https://username:password@gitlab.com/username/Repo.git (push)

3

ผมได้คำตอบของฉันจากgitcredentials (7) หน้าคู่มือการใช้งาน สำหรับกรณีของฉันฉันไม่มีแคชข้อมูลประจำตัวในการติดตั้ง Windows ของฉัน ฉันใช้ที่เก็บหนังสือรับรอง

หลังจากที่ฉันใช้ที่เก็บข้อมูลรับรองชื่อผู้ใช้ / รหัสผ่านจะถูกเก็บไว้ใน [โฟลเดอร์ผู้ใช้] / ไฟล์ git-credentials หากต้องการลบชื่อผู้ใช้ / รหัสผ่านเพียงลบเนื้อหาของไฟล์


2
เมื่อคุณไม่มีแคชข้อมูลรับรองใน windows ของคุณฉันขอแนะนำให้ใช้git config --global credential.helper wincredรหัสผ่านนี้ในการจัดเก็บอย่างถาวร
Chetabahana

2

เอกสารประกอบของผู้แต่งกล่าวถึงว่าคุณสามารถป้องกันไม่ให้ใช้ GitHub API ได้เพื่อที่จะทำหน้าที่เหมือนgit clone:

หากคุณตั้งค่าno-apiคีย์trueเป็นที่เก็บ GitHub มันจะทำการโคลนที่เก็บเหมือนกับที่เก็บ GitHub อื่นแทนการใช้ GitHub API แต่ต่างจากการใช้gitไดรเวอร์โดยตรงนักแต่งเพลงจะยังคงพยายามใช้ไฟล์ซิปของ GitHub

ดังนั้นส่วนจะมีลักษณะเช่นนี้:

"repositories": [
    {
        "type": "vcs",
        "no-api": true,
        "url": "https://github.com/your/repo"
    }
],

โปรดทราบว่า API อยู่ที่นั่นด้วยเหตุผล ดังนั้นนี่ควรเป็นวิธีการสุดท้ายที่เกี่ยวข้องกับการเพิ่มขึ้นของโหลดบน github.com


ไม่แน่ใจว่าคำตอบนี้เกี่ยวข้องกับคำถามต้นฉบับหรือไม่
Charles Oppermann

2

คุณยังแก้ไขไฟล์bashrcและเพิ่มสคริปต์ลงไป

สิ่งนี้จะถามรหัสผ่านของคุณหนึ่งครั้งเมื่อคุณเริ่ม Git แล้วจดจำรหัสผ่านนั้นจนกว่าคุณจะออกจากระบบ

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

0

หากคุณใช้osxkeychainและมีโทเค็นหมดอายุและต้องการอัปเดตให้ทำตามขั้นตอนเหล่านี้:

เรียกใช้เทอร์มินัลจากนั้นกด Enter สองครั้ง

git credential-osxkeychain erase
 host=github.com
 protocol=https

ตอนนี้คุณควรได้รับแจ้งชื่อผู้ใช้ / รหัสผ่าน อย่างไรก็ตามบางครั้งดูเหมือนว่าสิ่งนี้ไม่ 'ใช้' และคุณต้องกลับเข้ามาใหม่

ถ้าเป็นเช่นนั้นรีสตาร์ทเครื่องคอมพิวเตอร์ของคุณ ในครั้งต่อไปที่คุณเรียกใช้คำสั่ง git และป้อนชื่อผู้ใช้ / รหัสผ่านของคุณคำสั่งนั้นจะถูกบันทึกไว้

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