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"