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คุณต้องทำซ้ำ)
(ตรวจสอบให้แน่ใจว่าใส่ข้อความรหัสผ่านไปที่คีย์นั้น)
เชื่อใจกุญแจนั้น
ติดตั้งสคริปต์ผู้ช่วยข้อมูลรับรองในไดเรกทอรีภายใน%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 จะถูกเรียก)
(อย่าลืมส่วน ' protocol': ' http' หรือ 'https ' ทั้งนี้ขึ้นอยู่กับ URL ที่คุณจะใช้)
(ขณะนี้คุณสามารถลบ_netrcไฟล์, การรักษาเท่านั้น_netrc.gpgหนึ่งเข้ารหัส.)
(หมายเหตุ ' /': 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)
ลงชื่อออกโดย: 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)
ลงชื่อออกโดย: 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"