# رمز GitHub ومصادقة Git: personal access token وGit Credential Manager وpush بدون كلمة مرور

URL: https://skillaria.top/ar/guides/git/github-token-git-auth

منذ أغسطس 2021 لا يقبل GitHub كلمة مرور الحساب عند استخدام Git عبر HTTPS، بل يحتاج إلى رمز GitHub (personal access token) أو إلى الدخول عبر Git Credential Manager الذي يفتح المتصفح ويحفظ بيانات الدخول بنفسه. أنشئ الرمز من Settings ← Developer settings على github.com، وأدخله بدل كلمة المرور عند git push أو git clone، وسيحفظه credential.helper.

## لماذا لم يعد Git يقبل كلمة مرور GitHub

إذا أدخلت اسم المستخدم وكلمة المرور لحساب github.com عند `git push` وحصلت على رفض، فالسبب ليس خطأً مطبعياً. منذ 13 أغسطس 2021 أوقف GitHub الدخول بكلمة المرور لعمليات Git عبر HTTPS. بدلاً منها يُستخدم رمز GitHub (personal access token، أي PAT) أو المصادقة عبر المتصفح التي ينفذها Git Credential Manager.

تظهر رسالة الخطأ كالتالي:

```
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/... for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/user/project.git/'
```

السبب بسيط: كلمة مرور الحساب تمنح وصولاً كاملاً إلى كل شيء، ولا يمكن تقييدها بمستودع واحد، ومن الصعب إلغاؤها. أما الرمز فيُنشأ لمهمة محددة، وله مدة صلاحية ومجموعة من الأذونات، وإذا تسرّب يُلغى خلال دقيقة دون تغيير كلمة المرور. وقد سلكت GitLab وBitbucket الطريق نفسه، لذلك ينطبق ما يلي على المنصتين من حيث المبدأ.

## طريقتان للمصادقة: HTTPS وSSH

يتواصل Git مع المستودع البعيد بأحد بروتوكولين، ومن ذلك يتحدد كيف تسجّل دخولك.

| البروتوكول | عنوان المستودع | ما تستخدمه للمصادقة |
| --- | --- | --- |

| HTTPS | `https://github.com/user/project.git` | رمز أو Git Credential Manager (الدخول عبر المتصفح) |

| SSH | `git@github.com:user/project.git` | زوج مفاتيح SSH: الخاص لديك، والعام في إعدادات GitHub |

يُعدّ مفتاح SSH مرة واحدة، وبعدها لا يسأل Git عن اسم مستخدم ولا كلمة مرور. وقد شُرح إنشاؤه وإضافته إلى GitHub في مقال إعداد Git، أما هنا فنركز على HTTPS لأن المبتدئين يرون فيه طلب كلمة المرور في الغالب. ولمعرفة البروتوكول الذي يستخدمه مستودعك نفّذ:

```
git remote -v
origin  https://github.com/user/project.git (fetch)
origin  https://github.com/user/project.git (push)
```

## كيف تنشئ رمز GitHub (personal access token)

personal access token سلسلة عشوائية طويلة يصدرها GitHub بدلاً من كلمة المرور للوصول البرمجي. الرموز الكلاسيكية (classic) تبدأ بـ `ghp_`، والرموز الدقيقة (fine-grained) تبدأ بـ `github_pat_`. يُعرض الرمز مرة واحدة فقط بعد إنشائه، لذلك انسخه فوراً إلى مدير كلمات المرور.

### خطوة بخطوة

1. سجّل الدخول إلى github.com واضغط على صورتك في أعلى اليمين ثم افتح **Settings**.
2. في أسفل القائمة اليسرى اختر **Developer settings**، ثم **Personal access tokens**.
3. اختر النوع: **Fine-grained tokens** (موصى به) أو **Tokens (classic)**، واضغط زر إنشاء رمز جديد.
4. حدد اسماً واضحاً (مثلاً «الحاسوب المحمول - العمل») ومدة الصلاحية والأذونات.
5. اضغط زر الإنشاء وانسخ الرمز فوراً.

### Fine-grained أم classic

الرمز الدقيق يقتصر على مستودعات محددة وأذونات منفصلة. للعمل العادي على الكود اختر المستودعات المطلوبة، وفي أذونات المستودع امنح **Contents: Read and write**، وهذا يكفي للـ clone والـ pull والـ push. إذا كنت تقرأ مستودعاً خاصاً فقط فيكفي Read-only.

الرمز الكلاسيكي يسري على كل مستودعاتك دفعة واحدة. للـ push في المستودع تحتاج إلى النطاق `repo`، ولتعديل الملفات في `.github/workflows` تحتاج إضافةً إلى `workflow`. الكلاسيكي أسهل لكنه أخطر: التسريب يفتح الوصول إلى الحساب كله.

### مدة الصلاحية

يقترح GitHub عدة مدد ويتيح تحديد تاريخ مخصص. يمكنك إنشاء رمز بلا انتهاء، لكن لا يُنصح بذلك: الرمز الدائم المنسي ثغرة أمنية معروفة. الأنسب مدة 30 إلى 90 يوماً مع إعادة الإصدار عند التذكير الذي يرسله GitHub إلى بريدك قبل الانتهاء.

## Git push وgit clone بالرمز

استخدام الرمز أسهل مما يبدو: يسألك Git عن «Password»، فتلصق الرمز بدلاً من كلمة المرور.

```
$ git push origin main
Username for 'https://github.com': your-login
Password for 'https://your-login@github.com':
```

في الطرفية لا تظهر أحرف كلمة المرور أثناء الكتابة، وهذا طبيعي: الصق الرمز واضغط Enter. وفي Git Bash على Windows يعمل اللصق بالاختصار Shift+Insert أو بالزر الأيمن للفأرة.

### Git clone بالرمز

يُستنسخ المستودع الخاص بالطريقة نفسها: يطلب `git clone` اسم المستخدم والرمز. إذا أردت تجنب الأسئلة، مثلاً في سكربت، فيمكن وضع الرمز في العنوان مباشرة:

```
git clone https://your-login:@github.com/user/project.git
```

عيب هذه الطريقة: العنوان مع الرمز يُحفظ في `.git/config` وقد يصل إلى سجل الطرفية. لذلك بعد الاستنساخ أزل الرمز من العنوان:

```
git remote set-url origin https://github.com/user/project.git
```

في أنظمة CI تُمرَّر الرموز عبر متغيرات بيئة سرية، ولا تُكتب في الملفات. وفي GitHub Actions يوجد للمستودع الحالي الرمز المدمج `GITHUB_TOKEN`، ولذلك غالباً لا تحتاج إلى PAT منفصل هناك.

### GitLab: git clone بالرمز

في GitLab يُنشأ الرمز من إعدادات الملف الشخصي في قسم Access tokens، وللعمل على الكود تحتاج إلى النطاقين `read_repository` و`write_repository`. والمبدأ نفسه: اسم مستخدم GitLab، والرمز ككلمة مرور.

```
git clone https://oauth2:@gitlab.com/group/project.git
```

يقبل GitLab الاسم `oauth2` مع أي رمز شخصي، ويمكنك أيضاً وضع اسم المستخدم الخاص بك.

### Git pull وfetch

مع المستودع العام يعمل `git pull` و`git clone` دون مصادقة. يُطلب اسم المستخدم والرمز فقط للمستودع الخاص أو عند `git push`. وإذا طلب pull في مشروع عام كلمة مرور فغالباً يوجد خطأ في العنوان، لأن GitHub يرد على المستودع غير الموجود بالطريقة نفسها التي يرد بها على المستودع المغلق.

## Git Credential Manager: ما هو

إدخال الرمز في كل مرة مزعج. يتولى هذه المهمة credential helper، وهو برنامج مساعد يستدعيه Git عندما يحتاج إلى بيانات الدخول. يمرر له Git عنوان الخادم، فيعيد اسم المستخدم وكلمة المرور (أو الرمز) من مخزنه.

Git Credential Manager (GCM) أكثر هذه المساعدات راحة. وهو برنامج متعدد المنصات من GitHub وMicrosoft: عند أول push يفتح نافذة الدخول أو المتصفح، فتسجّل الدخول إلى GitHub (بما في ذلك التحقق الثنائي)، ويحصل GCM على الرمز بنفسه ويخزنه في مخزن النظام المحمي. لا تحتاج إلى إنشاء PAT يدوياً في هذه الحالة.

يدعم GCM كلاً من GitHub وGitLab وBitbucket وAzure DevOps. ويُثبَّت مع Git for Windows افتراضياً، وهو الخيار الذي تراه في المُثبِّت عند اختيار credential helper.

### أنواع credential.helper

| القيمة | أين تخزّن | متى تستخدمها |
| --- | --- | --- |

| `manager` | Git Credential Manager: مدير بيانات اعتماد Windows، وسلسلة مفاتيح macOS، وSecret Service في Linux | الخيار الموصى به لأجهزة العمل |

| `osxkeychain` | سلسلة مفاتيح macOS | المساعد القياسي لـ Git على Mac |

| `cache` | في الذاكرة، 15 دقيقة افتراضياً | خادم Linux لا تريد حفظ الرمز فيه على القرص |

| `store` | نص واضح في `~/.git-credentials` | أجهزة معزولة فقط؛ يستطيع أي شخص لديه وصول إلى الملف قراءة الرمز |

## إعداد مصادقة Git على Windows وmacOS وLinux

لمعرفة المساعد المضبوط مسبقاً نفّذ:

```
git config --show-origin --get-all credential.helper
```

### Windows

إذا أبقيت الإعدادات الافتراضية عند تثبيت Git، فإن GCM يعمل بالفعل: عند أول push في Git Bash أو PowerShell أو VS Code سيفتح نافذة الدخول إلى GitHub. وإذا لم يكن المساعد مضبوطاً فشغّله يدوياً:

```
git config --global credential.helper manager
```

### macOS

يستخدم Git على Mac عادةً `osxkeychain`: الرمز الذي تُدخله مرة واحدة يُحفظ في سلسلة المفاتيح. وللحصول على الدخول عبر المتصفح ثبّت Git Credential Manager (مثلاً عبر Homebrew: `brew install --cask git-credential-manager`)، وسيضبط نفسه في الإعدادات.

### Linux

على Linux يُثبَّت GCM منفصلاً (حزمة .deb أو أرشيف من إصدارات المشروع)، ثم تنفّذ الإعداد وتختار مكان التخزين:

```
# ضبط Git Credential Manager
git-credential-manager configure
git config --global credential.credentialStore secretservice
```

على خادم بلا واجهة رسومية يكون التخزين المؤقت في الذاكرة (cache) أبسط:

```
git config --global credential.helper 'cache --timeout=3600'
```

### بديل لـ GitHub: gh auth login

إذا كانت أداة GitHub CLI مثبتة، فالأمر `gh auth login` يرشدك إلى الدخول عبر المتصفح، والأمر `gh auth setup-git` يضبط Git ليأخذ بيانات الدخول من `gh`. وهذه طريقة مريحة لتسجيل الدخول في Git Bash بأمر واحد.

## كيف تعيد تعيين كلمة مرور Git المحفوظة أو تحديثها

أكثر حالة شيوعاً: انتهت صلاحية الرمز أو غيّرت الحساب، لكن Git ما زال يرسل البيانات القديمة ويحصل على `Authentication failed`. الحل حذف السجل المحفوظ، فيسأل Git من جديد عند الـ push التالي.

### أمر عام يعمل مع أي مساعد

```
printf "protocol=https\nhost=github.com\n\n" | git credential reject
```

### Git reset credentials على Windows

افتح «لوحة التحكم» ← «إدارة بيانات الاعتماد» (Credential Manager) ← «بيانات اعتماد Windows»، وابحث عن السجلات بالشكل `git:https://github.com` واحذفها. ويمكن فعل ذلك من سطر الأوامر أيضاً:

```
cmdkey /list | findstr git
cmdkey /delete:git:https://github.com
```

إذا كنت تستخدم GCM فله أمر خاص بالخروج من الحساب: `git credential-manager github logout <اسم-المستخدم>`.

### macOS

افتح «سلسلة المفاتيح» (Keychain Access)، وابحث عن السجل `github.com` من نوع «كلمة مرور الإنترنت» واحذفه. أو من الطرفية:

```
git credential-osxkeychain erase
host=github.com
protocol=https
```

بعد السطر الأخير اضغط Enter مرة أخرى لإرسال سطر فارغ.

### Linux وstore

في حالة `store` احذف السطر الخاص بـ github.com من `~/.git-credentials`، وفي حالة `cache` نفّذ `git credential-cache exit`.

## أخطاء المصادقة وكيفية إصلاحها

### Support for password authentication was removed

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

### git push: Authentication failed

الأسباب مرتبة حسب شيوعها: انتهت صلاحية الرمز؛ أو أُلغي الرمز؛ أو الرمز الدقيق ليس له وصول إلى هذا المستودع أو أن Contents للقراءة فقط؛ أو المخزن يحتوي على بيانات حساب آخر. تحقق من مدة الرمز وأذوناته في Developer settings، ثم أعد تعيين بيانات الاعتماد المحفوظة.

### remote: Permission denied (403)

المصادقة نجحت، لكن حسابك لا يملك صلاحية الكتابة في هذا المستودع. يجب أن يضيفك المالك إلى Collaborators، أو اعمل عبر fork الخاص بك وpull request.

### Repository not found

بالنسبة للمستودع الخاص لا يكشف GitHub عن وجوده، لذلك مع رمز خاطئ يكتب «not found». تحقق من العنوان بـ `git remote -v` ومن أذونات الرمز.

### Git clone يطلب كلمة المرور في كل مرة

لم يُضبط credential helper. فعّل `manager` أو `osxkeychain`، فبعد أول إدخال ناجح يتوقف Git عن السؤال. والخيار الآخر هو الانتقال إلى مفاتيح SSH.

## كيف تحفظ الرمز بأمان

- امنح أقل قدر من الأذونات: رمز دقيق للمستودعات المطلوبة بدلاً من الكلاسيكي بـ`repo`.
- حدد مدة صلاحية وأعد إصدار الرمز، ولا تمدده إلى ما لا نهاية.
- لا تُرسل الرموز إلى الـ commits ولا تضعها في عناوين remote؛ وإذا وصل الرمز إلى مستودع عام فقد يُلغيه GitHub تلقائياً، لكن اعتبره مكشوفاً واحذفه بنفسك.
- استخدم مخزن النظام (GCM أو سلسلة المفاتيح) بدلاً من `store`.
- رمز واحد لكل جهاز أو مهمة، فعند التسريب تُلغي الرمز المعني فقط.

## الخلاصة

كلمة مرور GitHub لا تعمل مع Git عبر HTTPS منذ 2021. هناك ثلاث طرق عملية: الدخول عبر Git Credential Manager في المتصفح، أو إنشاء رمز GitHub وإدخاله بدل كلمة المرور، أو الانتقال إلى مفاتيح SSH. يُنشأ الرمز من Settings ← Developer settings، ويحفظه credential helper، وعند ظهور Authentication failed تنفع عادةً إعادة إصدار الرمز ومسح بيانات الاعتماد القديمة. ويُشرح عملياً الاتصال بـ GitHub والعمل مع المستودعات البعيدة في دورة Git.

## FAQ

**هل يمكن رؤية رمز GitHub بعد إنشائه؟**

لا، يعرض GitHub الرمز مرة واحدة فقط. إذا لم تحفظه، فاحذف الرمز القديم وأنشئ رمزاً جديداً.

**هل أحتاج إلى رمز لاستنساخ مستودع عام؟**

لا، تُستنسخ المستودعات العامة وتُحدَّث عبر git pull دون مصادقة. الرمز مطلوب للمستودعات الخاصة ولـ git push.

**ماذا يحدث عند انتهاء صلاحية الرمز؟**

سيبدأ Git بالحصول على Authentication failed. أنشئ رمزاً جديداً (أو اضغط Regenerate للرمز القديم)، واحذف بيانات الاعتماد المحفوظة، وأدخل الرمز الجديد عند الـ push التالي.

**هل يعمل رمز GitHub مع التحقق الثنائي؟**

نعم، بل إنه مطلوب مع تفعيل 2FA لأنه يحل محل كلمة المرور ورمز التأكيد في عمليات Git. ويجتاز Git Credential Manager التحقق الثنائي بنفسه عند الدخول عبر المتصفح.

**أين يخزّن Git اسم المستخدم وكلمة المرور؟**

Git نفسه لا يخزنهما، بل يتولى ذلك credential helper: مدير بيانات اعتماد Windows، أو سلسلة مفاتيح macOS، أو Secret Service في Linux، أو الملف ~/.git-credentials عند استخدام helper من نوع store.


---
Source: Skillaria.Top (https://skillaria.top)
