Cannot open .git/FETCH_HEAD: Permission denied
Git रिपॉजिटरी में .git/ नामक एक विशेष फ़ोल्डर होता है। आपने यह फ़ोल्डर नहीं देखा होगा क्योंकि यह छिपा हुआ है। इस फ़ोल्डर की छिपी हुई स्थिति फ़ोल्डर नाम की शुरुआत में आने वाले फुल स्टॉप (".") द्वारा दर्शाई जाती है।
यह फ़ोल्डर रिपॉजिटरी के बारे में मेटाडेटा के विभिन्न टुकड़ों को समाहित करता है। यह आपके प्रोजेक्ट-विशिष्ट कॉन्फिगरेशन विकल्पों, आपके प्रोजेक्ट में रेफरेंस, आपके वर्तमान HEAD, और आपके रिपॉजिटरी के बारे में अन्य महत्वपूर्ण जानकारी को ट्रैक करता है।
Git को इस फ़ोल्डर पर पढ़ने और लिखने की पहुंच की आवश्यकता होती है। ऐसा इसलिए है क्योंकि जब आप git config और git pull जैसे कमांड चलाते हैं तो इसकी सामग्री बदल जाएगी।
एक उदाहरण परिदृश्य
हम GitHub से ck-git नामक एक रिपॉजिटरी को क्लोन करने जा रहे हैं। इस रिपॉजिटरी में README.md नामक एक फ़ाइल है। इस रिपॉजिटरी को क्लोन करने के लिए, हम git clone कमांड का उपयोग कर सकते हैं:
sudo git clone https://github.com/Career-Karma-Tutorials/ck-git
हमारी README.md फ़ाइल की सामग्री वर्तमान में है:
# ck-git
हम इस फ़ाइल को अधिक वर्णनात्मक README.md रखने के लिए बदलना चाहते हैं। हम इस फ़ाइल को टेक्स्ट एडिटर में खोलने जा रहे हैं और इसकी सामग्री को निम्नलिखित में बदल देंगे:
# Career Karma Git Demo A repository with demo files for Career Karma's Git tutorials.
यह बेहतर है। हमारी फ़ाइल अब हमारे 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 तक नहीं पहुंच सकता।
समाधान
हमने "sudo" कमांड का उपयोग करके ck-git रिपॉजिटरी को क्लोन किया। इसका मतलब है कि हमारा रिपॉजिटरी रूट यूजर के रूप में क्लोन किया गया था। क्योंकि रूट यूजर ने रिपॉजिटरी को क्लोन किया, रिपॉजिटरी में फ़ाइलें रूट यूजर के स्वामित्व में हैं।
हम इसे 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
हमारे फ़ोल्डर में सभी फ़ाइलें "रूट" के स्वामित्व में हैं, जो "स्टाफ" खाते का हिस्सा है। जब हम "sudo" का उपयोग किए बिना अपने रिमोट रिपॉजिटरी को पुल करने का प्रयास करते हैं, तो एक त्रुटि वापस आती है। ऐसा इसलिए है क्योंकि हमारे मानक यूजर खाते में फ़ोल्डर में फ़ाइलों को संशोधित करने की अनुमति नहीं है।
इस समस्या को ठीक करने के लिए, हम अपने फ़ोल्डर में फ़ाइलों के स्वामित्व को बदलने जा रहे हैं। हम chown कमांड का उपयोग करके ऐसा कर सकते हैं:
sudo chown -R james:staff .
यह कमांड हमारे रिपॉजिटरी में सभी फ़ाइलों और फ़ोल्डर्स के स्वामित्व विवरण को बदल देता है, जिसमें .git/ फ़ोल्डर भी शामिल है। अब हम निर्देशिका के मालिक हैं और प्रोजेक्ट फ़ोल्डर तक पूरी पहुंच रखते हैं। अब हम अपना कोड पुल करने में सक्षम होना चाहिए:
git pull
यह कमांड सफलतापूर्वक निष्पादित होता है और वापस लौटाता है:
Already up to date.
अब हम जानते हैं कि हमारे रिमोट रिपॉजिटरी में कोई परिवर्तन नहीं किया गया है क्योंकि हमने आखिरी बार अपना कोड पुल किया था। हमने आखिरी बार कोड तब पुल किया था जब हमने रिपॉजिटरी बनाई थी।
निष्कर्ष
Git "Cannot open .git/FETCH_HEAD: Permission denied" त्रुटि तब होती है जब आप रिमोट रिपॉजिटरी से कोड पुल करने का प्रयास करते हैं जब आपके प्रोजेक्ट फ़ोल्डर में .git/ निर्देशिका आपके वर्तमान यूजर के लिए दुर्गम होती है।
इस त्रुटि को हल करने के लिए, सुनिश्चित करें कि आपके वर्तमान यूजर के पास उस Git रिपॉजिटरी पर पढ़ने-लिखने का विशेषाधिकार है जिसके साथ आप काम कर रहे हैं।