مقدمة: عندما يتحول الأمر البسيط 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موقف مألوف؟ إذا كان الأمر كذلك، فأنت في المكان الصحيح. هذا الخطأ هو «حجر عثرة» كلاسيكي لمطوري Go الذين يعملون مع المستودعات الخاصة على GitHub. على 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اضغط Enter لحفظ المفتاح في المجلد القياسي (~/.ssh/id_ed25519). يمكنك إضافة عبارة مرور - فهذا يزيد الأمان.
الخطوة 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\nانتقل إلى GitHub ← Settings ← SSH and GPG keys ← New SSH key. الصق المفتاح واحفظه.
\n\nالخطوة 4. إعداد Git لاستخدام SSH
\nالآن الجزء الأهم: يجب إجبار Go على استخدام SSH بدلاً من HTTPS. للقيام بذلك، قم بتحرير الملف ~/.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: استخدام رمز الوصول الشخصي (PAT) - لـ CI/CD والنصوص البرمجية
\n\nSSH مناسب تمامًا للتطوير المحلي