परिचय: जब एक साधारण go get एक पहेली बन जाता है
\n\nक्या आपने कभी go get github.com/आपका-खाता/निजी-रिपॉजिटरी चलाने की कोशिश की है और जवाब में एक ठंडा, अमित्र संदेश मिला है?
go get github.com/आपका-खाता/निजी-रिपॉजिटरी: \n module github.com/आपका-खाता/निजी-रिपॉजिटरी: \n git ls-remote -q origin in /tmp/...: exit status 128:\n remote: Invalid username or password.\n fatal: Authentication failed for 'https://github.com/आपका-खाता/निजी-रिपॉजिटरी.git'\n\nया, इससे भी अधिक रहस्यमय:
\ngo get github.com/आपका-खाता/निजी-रिपॉजिटरी: \n terminal prompts disabled\n Confirm the import path was entered correctly.\n If this is a private repo, see https://golang.org/doc/faq#git_https\n\nपरिचित स्थिति है? यदि हाँ — तो आप सही जगह पर आए हैं। यह त्रुटि GitHub पर निजी रिपॉजिटरी के साथ काम करने वाले Go डेवलपर्स के लिए एक क्लासिक «ठोकर का पत्थर» है। Stack Overflow पर इस प्रश्न को हजारों बार देखा गया है, और आज हम इसे हमेशा के लिए समझ लेंगे।
\n\nइस लेख में हम केवल समस्या का समाधान नहीं करेंगे — हम समझेंगे कि यह क्यों होती है, और पर्यावरण को इस तरह से कॉन्फ़िगर करना सीखेंगे ताकि go get निजी रिपॉजिटरी के साथ मक्खन की तरह काम करे। चलिए शुरू करते हैं!
Go निजी रिपॉजिटरी के साथ काम करने से क्यों मना करता है?
\n\nकारण समझने के लिए, Go के «हुड के नीचे» झाँकना होगा। जब आप go get चलाते हैं, तो Go टूल कई काम करता है:
- \n
- यह HTTPS के माध्यम से रिपॉजिटरी को क्लोन करने का प्रयास करता है (यह डिफ़ॉल्ट प्रोटोकॉल है)। \n
- यदि रिपॉजिटरी निजी है, तो Git प्रमाणीकरण (लॉगिन/पासवर्ड) का अनुरोध करता है। \n
- Go, डिफ़ॉल्ट रूप से, टर्मिनल में इंटरैक्टिव अनुरोधों को अक्षम करता है — यही वह «terminal prompts disabled» है। \n
Go ऐसा क्यों करता है? यह सरल है: स्वचालित बिल्ड या CI/CD पाइपलाइनों में, इंटरैक्टिव पासवर्ड इनपुट संभव नहीं है। इसलिए Go इनपुट की प्रतीक्षा में फँसने के बजाय त्रुटि के साथ «गिरना» पसंद करता है।
\n\nमुख्य विचार: «terminal prompts disabled» त्रुटि कोई बग नहीं, बल्कि एक फीचर है। Go आपसे कह रहा है: «मैं आपसे पासवर्ड नहीं पूछ सकता, मुझे तैयार क्रेडेंशियल दें।» और हमारा काम उन्हें प्रदान करना है।
\n\nविधि 1: SSH का उपयोग (सबसे विश्वसनीय और सही)
\n\nयह अनुशंसित विधि है। SSH कुंजियाँ सुरक्षित, सुविधाजनक हैं और हर बार पासवर्ड दर्ज करने की आवश्यकता नहीं होती है।
\n\nचरण 1. SSH कुंजी जनरेट करें (यदि नहीं है)
\nटर्मिनल खोलें और चलाएँ:
\nssh-keygen -t ed25519 -C "आपका_ईमेल@example.com"\nकुंजी को मानक फ़ोल्डर (~/.ssh/id_ed25519) में सहेजने के लिए Enter दबाएँ। आप एक पासफ़्रेज़ जोड़ सकते हैं — इससे सुरक्षा बढ़ेगी।
चरण 2. SSH एजेंट में कुंजी जोड़ें
\neval "$(ssh-agent -s)"\nssh-add ~/.ssh/id_ed25519\n\nचरण 3. GitHub पर सार्वजनिक कुंजी जोड़ें
\n~/.ssh/id_ed25519.pub की सामग्री कॉपी करें:
cat ~/.ssh/id_ed25519.pub\nGitHub पर जाएँ → Settings → SSH and GPG keys → New SSH key। कुंजी चिपकाएँ और सहेजें।
\n\nचरण 4. SSH का उपयोग करने के लिए Git कॉन्फ़िगर करें
\nअब सबसे महत्वपूर्ण: Go को HTTPS के बजाय SSH का उपयोग करने के लिए बाध्य करना होगा। इसके लिए ~/.gitconfig फ़ाइल संपादित करें:
[url "git@github.com:"]\n insteadOf = https://github.com/\nयह निर्देश Git से कहता है: «जब तुम https://github.com/ देखो — तो git@github.com: (SSH) का उपयोग करो»।
चरण 5. पुनः प्रयास करें
\ngo get github.com/आपका-खाता/निजी-रिपॉजिटरी@latest\nयदि सब कुछ सही ढंग से कॉन्फ़िगर किया गया है — त्रुटि गायब हो जाएगी। Go प्रमाणीकरण के लिए SSH का उपयोग करेगा, और SSH एजेंट कुंजी प्रदान करेगा।
\n\nविधि 2: Personal Access Token (PAT) का उपयोग — CI/CD और स्क्रिप्ट के लिए
\n\nSSH स्थानीय विकास के लिए उपयुक्त है