Git ต้องการสิทธิ์ในการเขียนไฟล์ในไดเร็กทอรีชื่อ .git/ ภายในโฟลเดอร์โครงการของคุณ หากบรรทัดคำสั่ง Git ไม่มีสิทธิ์เข้าถึงโฟลเดอร์นี้ คุณจะพบข้อผิดพลาดเช่น "Cannot open .git/FETCH_HEAD:Permission denied" เมื่อคุณพยายามดึงไฟล์
ในคู่มือนี้ เราจะพูดถึงความหมายของข้อผิดพลาดนี้และสาเหตุของข้อผิดพลาด เราจะอธิบายตัวอย่างเพื่อให้คุณได้เรียนรู้วิธีแก้ไขในโปรแกรม
ไม่สามารถเปิด .git/FETCH_HEAD:ปฏิเสธการอนุญาต
ที่เก็บ Git มีโฟลเดอร์พิเศษที่เรียกว่า .git/ คุณอาจไม่เห็นโฟลเดอร์นี้เพราะถูกซ่อนไว้ สถานะที่ซ่อนอยู่ของโฟลเดอร์นี้จะแสดงด้วยเครื่องหมายจุด ("") ที่มาที่จุดเริ่มต้นของชื่อโฟลเดอร์
โฟลเดอร์นี้ประกอบด้วยข้อมูลเมตาต่างๆ เกี่ยวกับที่เก็บ โดยจะติดตามตัวเลือกการกำหนดค่าเฉพาะโปรเจ็กต์ของคุณ ข้อมูลอ้างอิงในโครงการของคุณ HEAD ปัจจุบันของคุณ และข้อมูลสำคัญอื่นๆ เกี่ยวกับที่เก็บของคุณ
Git ต้องการสิทธิ์อ่านและเขียนในโฟลเดอร์นี้ เนื่องจากเนื้อหาจะเปลี่ยนไปเมื่อคุณเรียกใช้คำสั่ง เช่น git config และ git pull
ตัวอย่างสถานการณ์
เราจะทำการโคลนที่เก็บที่เรียกว่า ck-git จาก GitHub ที่เก็บนี้มีไฟล์ชื่อ README.md ในการโคลนที่เก็บนี้ เราสามารถใช้คำสั่ง git clone:
sudo git clone https://github.com/Career-Karma-Tutorials/ck-git
เนื้อหาของไฟล์ README.md ของเราในปัจจุบันคือ:
# ck-git
เราต้องการเปลี่ยนไฟล์นี้ให้มี README.md ที่สื่อความหมายมากขึ้น เราจะเปิดไฟล์นี้ในโปรแกรมแก้ไขข้อความและเปลี่ยนเนื้อหาดังต่อไปนี้:
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
# Career Karma Git Demo
พื้นที่เก็บข้อมูลพร้อมไฟล์สาธิตสำหรับบทช่วยสอน Git ของ Career Karma
นั่นดีกว่า. ไฟล์ของเราอธิบายวัตถุประสงค์ของที่เก็บ Git ได้แม่นยำยิ่งขึ้น ตอนนี้ มาเพิ่มการเปลี่ยนแปลงนี้ในพื้นที่จัดเตรียมเพื่อให้เราสร้างคอมมิตได้:
sudo git add README.md
Git รู้ดีว่าเราต้องการเพิ่ม README.md ในการคอมมิตครั้งต่อไป ในการทำให้การเปลี่ยนแปลงแสดงในที่เก็บระยะไกลของเรา เราต้องเพิ่มการเปลี่ยนแปลงเหล่านี้ในการคอมมิต:
sudo git commit -m "docs: Make README.md more descriptive"
ความมุ่งมั่นของเราพร้อมที่จะถูกส่งไปยังที่เก็บระยะไกลของเราแล้ว ก่อนที่เราจะกดโค้ด เราจะดึงที่เก็บเวอร์ชันระยะไกลของเรา สิ่งนี้จะช่วยให้เราแน่ใจว่าเราอัปเดตการเปลี่ยนแปลงที่เกิดขึ้นตั้งแต่เราโคลนที่เก็บ:
git pull
คำสั่งนี้ส่งคืน:
error: cannot open .git/FETCH_HEAD: Permission denied
ข้อผิดพลาดนี้บอกเราว่า Git ไม่สามารถเข้าถึงไฟล์การกำหนดค่า FETCH_HEAD ได้
การแก้ปัญหา
เราโคลนที่เก็บ ck-git โดยใช้คำสั่ง "sudo" ซึ่งหมายความว่าที่เก็บของเราถูกโคลนในฐานะผู้ใช้รูท เนื่องจากผู้ใช้รูทโคลนที่เก็บ ไฟล์ในที่เก็บจึงเป็นเจ้าของโดยผู้ใช้รูท
เราสามารถเห็นสิ่งนี้ได้โดยการรันคำสั่ง ls -la:
total 8 drwxr-xr-x 4 root staff 128 Sep 17 07:15 . drwxr-xr-x+ 90 James staff 2880 Sep 17 07:15 .. drwxr-xr-x 12 root staff 384 Sep 17 07:15 .git -rw-r--r-- 1 root staff 1 Sep 17 07:15 README.md
ไฟล์ทั้งหมดในโฟลเดอร์ของเราเป็นของ "root" ซึ่งเป็นส่วนหนึ่งของบัญชี "staff" เมื่อเราพยายามดึงที่เก็บระยะไกลของเราโดยไม่ใช้ “sudo” ข้อผิดพลาดจะถูกส่งกลับ เนื่องจากบัญชีผู้ใช้มาตรฐานของเราไม่มีสิทธิ์แก้ไขไฟล์ในโฟลเดอร์
เพื่อแก้ไขปัญหานี้ เราจะเปลี่ยนความเป็นเจ้าของไฟล์ในโฟลเดอร์ของเรา เราสามารถทำได้โดยใช้คำสั่ง chown:
sudo chown -R james:staff .
คำสั่งนี้จะเปลี่ยนรายละเอียดการเป็นเจ้าของไฟล์และโฟลเดอร์ทั้งหมดในที่เก็บของเรา รวมถึงโฟลเดอร์ .git/ ตอนนี้เราเป็นเจ้าของไดเร็กทอรีและสามารถเข้าถึงโฟลเดอร์โปรเจ็กต์ได้อย่างเต็มที่ ตอนนี้เราควรจะสามารถดึงรหัสของเราได้:
git pull
คำสั่งนี้ดำเนินการได้สำเร็จและส่งคืน:
Already up to date.
ตอนนี้เราทราบแล้วว่าไม่มีการเปลี่ยนแปลงใดๆ กับที่เก็บระยะไกลของเราตั้งแต่เราดึงโค้ดครั้งล่าสุด เราดึงโค้ดครั้งล่าสุดเมื่อเราสร้างที่เก็บ
บทสรุป
ข้อผิดพลาด "Cannot open .git/FETCH_HEAD:Permission denied" ของ Git เกิดขึ้นเมื่อคุณพยายามดึงโค้ดจากที่เก็บระยะไกลเมื่อผู้ใช้ปัจจุบันไม่สามารถเข้าถึงไดเร็กทอรี .git/ ในโฟลเดอร์โครงการของคุณ
ในการแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าผู้ใช้ปัจจุบันของคุณมีสิทธิ์ในการอ่าน-เขียนไปยังที่เก็บ Git ที่คุณกำลังทำงานอยู่