دليل5 دقائق قراءة

استخدام SSH تلقائيًا بدل HTTPS في Git

إعداد مفاتيح SSH لحسابات Git، ثم تحويل روابط HTTPS تلقائيًا، بما فيها روابط الوحدات الفرعية والتبعيات التي لا تتحكم في ملفاتها.

عرض بصيغة Markdown

قبل عشرة أيام من كتابة هذه المقالة، أوقفت GitHub قبول كلمات مرور الحسابات في عمليات Git عبر HTTPS. أصبح أحد البدائل استخدام رمز وصول شخصي (personal access token) بدل كلمة المرور.

يمكن لأداة حفظ بيانات الاعتماد (credential helper)، مثل osxkeychain أو Git Credential Manager، أن تتولى حفظ الرمز. ويمكن إعداد المصادقة أيضًا عبر gh auth login. هذا خيار مناسب إذا كنت تفضل HTTPS. أما الرموز ذات الصلاحية المحددة فتحتاج إلى تجديد عند انتهائها، مع التأكد من الصلاحيات المطلوبة.

أستخدم SSH لتجنب تكرار هذا الإعداد. أنشئ زوجًا من المفاتيح، وأحتفظ بالمفتاح الخاص على جهازي، ثم أضيف المفتاح العام إلى الحساب. وباستخدام قاعدة في Git، أستطيع تحويل روابط HTTPS إلى SSH حتى عندما تأتي من ملفات تبعيات كتبها غيري.

سننشئ المفتاح ونسجله، ثم نحدد لـ SSH أي مفتاح يستخدم، ونضبط Git ليعيد كتابة الروابط تلقائيًا.

توليد المفتاح

ssh-keygen -t ed25519 -C "personal github" -f ~/.ssh/personal-github

يستخدم الأمر Ed25519، بمفاتيح قصيرة ودون الحاجة إلى اختيار حجم المفتاح. إذا كان الخادم أقدم من OpenSSH 6.5، فاستخدم -t rsa -b 4096 بدلًا منه.

اختر اسمًا يوضح الغرض من المفتاح، مثل personal-github أو work-gitlab. أنشئ مفتاحًا لكل حساب؛ لا تقبل GitHub إضافة المفتاح العام نفسه إلى حساب آخر. وأنشئ مفتاحًا مستقلًا لكل جهاز، حتى تستطيع إلغاء وصول جهاز واحد دون تغيير إعدادات الأجهزة الأخرى. اسم مثل id_ed25519_2 لن يساعدك كثيرًا عند مراجعة المفاتيح لاحقًا.

احمِ المفتاح بعبارة مرور، واستخدم ssh-agent حتى لا تضطر إلى إدخالها مع كل عملية دفع.

إضافة المفتاح العام إلى الخادم

انسخ محتوى المفتاح العام، أي الملف الذي ينتهي بـ .pub. احتفظ بالمفتاح الخاص، الذي لا يحمل هذا الامتداد، على جهازك:

# macOS
pbcopy < ~/.ssh/personal-github.pub

# Linux
xclip -selection clipboard < ~/.ssh/personal-github.pub

ثم ألصقه في إعدادات حسابك: GitHub أو GitLab أو Bitbucket.

تحديد المفتاح الذي يستخدمه SSH

يبحث SSH عن أسماء المفاتيح الافتراضية، مثل id_ed25519 وid_rsa. إذا اخترت اسمًا مختلفًا، فأضف مساره إلى ~/.ssh/config:

Host github.com
  User git
  IdentityFile ~/.ssh/personal-github
  IdentitiesOnly yes
  AddKeysToAgent yes

Host gitlab.com
  User git
  IdentityFile ~/.ssh/work-gitlab
  IdentitiesOnly yes
  AddKeysToAgent yes

يحدد IdentitiesOnly yes المفاتيح التي يسمح SSH باستخدامها لهذا الاتصال. بدونه قد يعرض مفاتيح أخرى من ssh-agent، فتتعرف GitHub عليك بحساب مختلف. قد تظهر عندها رسالة «المستودع غير موجود» رغم أن حسابك المقصود يملك صلاحية الوصول إليه.

على macOS، يمكنك إضافة UseKeychain yes إلى كتلة الخادم لحفظ عبارة المرور في Keychain. هذا خيار خاص بنسخة Apple من OpenSSH؛ قد ترفضه نسخة Homebrew إذا كانت هي المستخدمة أولًا في PATH. في إعداد macOS المستخدم وقت كتابة المقالة، يُضاف المفتاح بالأمر ssh-add -K ~/.ssh/personal-github.

اختبر الاتصال مرة واحدة:

ssh -T git@github.com

في أول اتصال، يعرض SSH بصمة مفتاح الخادم. قارنها بالبصمة التي تنشرها GitHub قبل قبولها بـ yes. بعد نجاح المصادقة، ستظهر تحية تتضمن اسم حسابك؛ تحقق من أنه الحساب المقصود.

إذا توقف الاتصال دون استجابة، فقد تكون الشبكة تحجب المنفذ 22. تتيح GitHub اتصال SSH عبر المنفذ 443 أيضًا:

Host github.com
  Hostname ssh.github.com
  Port 443
  # ...بقيّة الكتلة كما سبق

تأكد من نجاح اتصال SSH قبل تفعيل إعادة كتابة الروابط في الخطوة التالية.

إعادة كتابة روابط HTTPS إلى SSH

ما دامت روابط المستودعات تبدأ بـ https://، سيستخدم Git اتصال HTTPS. بدل تعديل كل مستودع، أضف القواعد التالية إلى ~/.gitconfig:

[url "ssh://git@github.com/"]
  insteadOf = https://github.com/

[url "ssh://git@gitlab.com/"]
  insteadOf = https://gitlab.com/

[url "ssh://git@bitbucket.org/"]
  insteadOf = https://bitbucket.org/

يعيد Git كتابة روابط HTTPS المطابقة لهذه القواعد قبل الاتصال. يفيد ذلك خصوصًا مع submodules عندما يحتوي .gitmodules على روابط HTTPS لا تتحكم فيها. وينطبق أيضًا على الأدوات التي تمرر إلى Git روابط مستودعات، مثل تبعية CocoaPods محددة بـ :git => أو go get تحت GOPRIVATE أو تبعية npm بصيغة git+https://.

لن تؤثر القواعد على مدير حزم ينزّل أرشيفًا مباشرة دون استخدام Git. من أمثلة ذلك CDN في CocoaPods منذ الإصدار 1.8، وGo proxy للوحدات العامة، وأرشيفات codeload المستخدمة مع اختصار npm بصيغة github:user/repo.

كذلك، تخص هذه الإعدادات مستخدمك على هذا الجهاز. لبيئة CI إعدادات وبيانات اعتماد مستقلة؛ لا تنقل إليها مفتاحك الشخصي. استخدم وسيلة مصادقة مخصصة لها بصلاحيات محدودة.

التحقق من إعادة الكتابة

يمكنك التحقق من إعادة الكتابة دون أي اتصال بالشبكة:

git ls-remote --get-url https://github.com/omaralbeik/SwifterSwift.git

إذا ظهر ssh://git@github.com/omaralbeik/SwifterSwift.git، فالقاعدة تعمل. هذا الاختبار أدق من استنساخ مستودع عام، لأن الاستنساخ عبر HTTPS ينجح أيضًا دون بيانات اعتماد.

بعد ذلك، يتولى Git تحويل الرابط، ويختار SSH المفتاح المحدد للخادم. إذا حدثت مشكلة، يمكنك فحص كل خطوة على حدة.

إذا جرّبت هذا الإعداد مع عدة حسابات Git أو تبعية خاصة، أخبرني كيف عمل لديك. وشارك الدليل مع زميل يضطر إلى تعديل روابط المستودعات يدويًا كل مرة.

المواضيع