- كل المقالات
- استخدام SSH تلقائيًا بدل HTTPS في Git
استخدام SSH تلقائيًا بدل HTTPS في Git
إعداد مفاتيح SSH لحسابات Git، ثم تحويل روابط HTTPS تلقائيًا، بما فيها روابط الوحدات الفرعية والتبعيات التي لا تتحكم في ملفاتها.
قبل عشرة أيام من كتابة هذه المقالة، أوقفت 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 أو تبعية خاصة، أخبرني كيف عمل لديك. وشارك الدليل مع زميل يضطر إلى تعديل روابط المستودعات يدويًا كل مرة.