استنساخ المستودعات
الاستنساخ هو عملية إنشاء نسخة محلية من مستودع بعيد. في هذا الدرس، سنستكشف كيفية استنساخ المستودعات، وفهم خيارات الاستنساخ المختلفة، والتعرف على استراتيجيات الاستنساخ المختلفة.
ما هو الاستنساخ؟
الاستنساخ ينشئ نسخة كاملة من مستودع بعيد على جهازك المحلي، بما في ذلك جميع الملفات والفروع والالتزامات والسجل. إنها الطريقة الأكثر شيوعاً لبدء العمل مع مشروع موجود.
مفهوم أساسي: عند الاستنساخ، يقوم Git تلقائياً بإعداد المستودع البعيد كـ "origin" وينشئ نسخة محلية من الفرع الافتراضي، مما يمنحك مستودعاً محلياً يعمل بشكل كامل.
أمر الاستنساخ الأساسي
الصيغة الأساسية للاستنساخ:
# استنساخ مستودع
git clone <repository-url>
# أمثلة:
# HTTPS
git clone https://github.com/user/repo.git
# SSH
git clone git@github.com:user/repo.git
# سيتم استنساخ المستودع في مجلد باسم "repo"
الاستنساخ في دليل محدد
يمكنك تحديد اسم دليل مخصص:
# الاستنساخ في دليل محدد
git clone <repository-url> <directory-name>
# مثال:
git clone https://github.com/user/repo.git my-project
# الآن المستودع موجود في مجلد "my-project"
cd my-project
نصيحة: استخدم اسم دليل مخصص عندما يكون اسم المستودع عاماً أو عندما تريد تنظيم المشاريع بطريقة تسمية محددة.
ما يحدث أثناء الاستنساخ
عند استنساخ مستودع، يقوم Git بـ:
1. إنشاء دليل جديد باسم المستودع
2. تهيئة دليل .git بداخله
3. تنزيل جميع بيانات المستودع (الالتزامات والملفات والفروع)
4. إنشاء مستودع بعيد يسمى "origin" يشير إلى المصدر
5. فحص الفرع الافتراضي (عادةً main أو master)
6. إعداد التتبع بين الفروع المحلية والبعيدة
# بعد الاستنساخ، يمكنك التحقق:
cd repo
git remote -v
# origin https://github.com/user/repo.git (fetch)
# origin https://github.com/user/repo.git (push)
git branch -a
# * main
# remotes/origin/HEAD -> origin/main
# remotes/origin/main
# remotes/origin/develop
النسخ الضحلة
النسخ الضحلة تقوم بتنزيل سجل الالتزامات الحديثة فقط، مما يجعل الاستنساخ أسرع ويستخدم مساحة أقل على القرص:
# الاستنساخ مع أحدث التزام فقط
git clone --depth=1 https://github.com/user/repo.git
# الاستنساخ مع آخر 50 التزاماً
git clone --depth=50 https://github.com/user/repo.git
# التحقق مما إذا كان المستودع ضحلاً
git rev-parse --is-shallow-repository
# المخرجات: true
# تحويل النسخة الضحلة إلى نسخة كاملة لاحقاً
git fetch --unshallow
حالات استخدام النسخ الضحلة:
- خطوط CI/CD (تحتاج فقط إلى أحدث كود)
- نشر الكود (لا تحتاج إلى السجل الكامل)
- المستودعات الكبيرة ذات السجل الواسع
- مساحة القرص أو النطاق الترددي المحدود
استنساخ فرع محدد
استنساخ والانتقال إلى فرع محدد:
# استنساخ فرع محدد فقط
git clone --branch <branch-name> <repository-url>
# أو
git clone -b <branch-name> <repository-url>
# مثال: استنساخ والانتقال إلى فرع develop
git clone -b develop https://github.com/user/repo.git
# الجمع مع النسخة الضحلة
git clone --depth=1 -b develop https://github.com/user/repo.git
استنساخ فرع واحد
تنزيل فرع واحد فقط، باستثناء الآخرين:
# استنساخ الفرع المحدد فقط (بدون فروع أخرى)
git clone --single-branch --branch main https://github.com/user/repo.git
# لاحقاً، إذا كنت بحاجة إلى فروع أخرى:
git remote set-branches origin '*'
git fetch --all
# أو إضافة فرع محدد:
git remote set-branches --add origin develop
git fetch origin develop
ملاحظة: --single-branch مفيد عندما تحتاج فقط إلى فرع واحد وتريد توفير النطاق الترددي ومساحة القرص، ولكنه يحد من قدرتك على العمل مع فروع أخرى دون تكوين إضافي.
المستودعات العارية
المستودع العاري ليس لديه دليل عمل - يحتوي فقط على بيانات Git:
# الاستنساخ كمستودع عاري
git clone --bare https://github.com/user/repo.git repo.git
# المستودعات العارية:
# - ليس لديها دليل عمل (لا توجد ملفات للتحرير)
# - تستخدم كمستودعات مركزية على الخوادم
# - مسماة بامتداد .git بالاتفاقية
# - لا يمكن الالتزام مباشرة (تستقبل فقط عمليات الدفع)
# مثال على البنية:
repo.git/
├── HEAD
├── config
├── objects/
├── refs/
└── ...
حالات استخدام المستودعات العارية:
- مستودعات الخادم المركزية
- مستودعات النسخ الاحتياطي
- استضافة Git على خادمك الخاص
- المستودعات التي تستقبل عمليات الدفع فقط
نسخ المرآة
نسخ المرآة تنشئ نسخة طبق الأصل، بما في ذلك جميع المراجع:
# إنشاء نسخة مرآة
git clone --mirror https://github.com/user/repo.git repo-mirror.git
# نسخ المرآة:
# - هي مستودعات عارية
# - تتضمن جميع المراجع (الفروع والوسوم والملاحظات)
# - تربط المراجع البعيدة مباشرة
# - مثالية لإنشاء نسخ احتياطية أو ترحيل المستودعات
# دفع المرآة إلى موقع جديد:
cd repo-mirror.git
git push --mirror https://new-location.com/user/repo.git
الاستنساخ باسم مستودع بعيد محدد
تغيير اسم المستودع البعيد الافتراضي "origin":
# الاستنساخ باسم مستودع بعيد مخصص
git clone --origin upstream https://github.com/user/repo.git
# التحقق من اسم المستودع البعيد
git remote -v
# upstream https://github.com/user/repo.git (fetch)
# upstream https://github.com/user/repo.git (push)
# مفيد عند إعداد سير عمل النسخ المتشعبة
الاستنساخ مع الوحدات الفرعية
بعض المستودعات تحتوي على وحدات فرعية (مستودعات متداخلة):
# استنساخ المستودع وتهيئة الوحدات الفرعية
git clone --recurse-submodules https://github.com/user/repo.git
# أو
git clone --recursive https://github.com/user/repo.git
# إذا كنت قد استنسخت بالفعل بدون وحدات فرعية:
git submodule update --init --recursive
# التحقق من حالة الوحدة الفرعية
git submodule status
نصيحة: استخدم دائماً --recurse-submodules إذا كنت تعلم أن المستودع يحتوي على وحدات فرعية، وإلا ستكون الدلائل الفرعية فارغة.
خيارات أداء الاستنساخ
تحسين الاستنساخ للسرعة والكفاءة:
# الاستنساخ مع عرض التقدم
git clone --progress https://github.com/user/repo.git
# الاستنساخ بهدوء (بدون مخرجات)
git clone --quiet https://github.com/user/repo.git
# أو
git clone -q https://github.com/user/repo.git
# الاستنساخ مع مخرجات مفصلة
git clone --verbose https://github.com/user/repo.git
# أو
git clone -v https://github.com/user/repo.git
# تحديد النطاق الترددي (بالكيلوبايت/ثانية)
git clone --config http.postBuffer=1048576 https://github.com/user/repo.git
استنساخ HTTPS مقابل SSH
فهم البروتوكولين الرئيسيين:
استنساخ HTTPS:
git clone https://github.com/user/repo.git
المزايا:
✓ يعمل في كل مكان (لا توجد مشاكل جدار ناري)
✓ سهل الإعداد
✓ لا حاجة لمفاتيح SSH
✓ يمكن استخدام رموز الوصول الشخصية
العيوب:
✗ قد يتطلب بيانات الاعتماد لكل عملية
✗ أبطأ قليلاً من SSH
✗ تحتاج إلى تخزين بيانات الاعتماد أو استخدام الرموز
استنساخ SSH:
git clone git@github.com:user/repo.git
المزايا:
✓ لا توجد مطالبات بكلمة المرور (يستخدم مفاتيح SSH)
✓ أكثر أماناً
✓ مصادقة أسرع
✓ أفضل للنصوص التلقائية
العيوب:
✗ يتطلب إعداد مفتاح SSH
✗ قد يتم حظره بواسطة جدران نار صارمة
✗ الإعداد الأولي أكثر تعقيداً
الاستنساخ من مسار محلي
يمكنك الاستنساخ من دليل محلي:
# الاستنساخ من مسار محلي
git clone /path/to/local/repo new-copy
# الاستنساخ من مسار محلي كـ URL file://
git clone file:///path/to/local/repo new-copy
# الاستنساخ من مسار الشبكة
git clone //server/share/repo.git new-copy
# ينشئ هذا نسخة مستقلة كاملة
حالة الاستخدام: إنشاء نسخ احتياطية، اختبار التغييرات في العزلة، أو العمل على نفس المشروع في مواقع متعددة على جهازك.
الاستنساخ الجزئي
ميزة متقدمة للاستنساخ دون تنزيل جميع الكائنات:
# الاستنساخ بدون البلوبات (محتويات الملفات)
git clone --filter=blob:none https://github.com/user/repo.git
# الاستنساخ بدون الأشجار
git clone --filter=tree:0 https://github.com/user/repo.git
# الاستنساخ بدون البلوبات الكبيرة (أكبر من 1 ميجابايت)
git clone --filter=blob:limit=1m https://github.com/user/repo.git
# يتم تنزيل الكائنات عند الطلب عند الحاجة
ميزة متقدمة: النسخ الجزئية مفيدة للمستودعات الكبيرة جداً لكنها تتطلب Git 2.19+ ودعم الخادم. استخدم بحذر حيث قد تكون بعض عمليات Git أبطأ.
التكوين بعد الاستنساخ
التكوينات الشائعة بعد الاستنساخ:
# بعد الاستنساخ، كوّن هويتك
git config user.name "Your Name"
git config user.email "your.email@example.com"
# إعداد مستودعات بعيدة إضافية (لسير عمل النسخة المتشعبة)
git remote add upstream https://github.com/original/repo.git
# تكوين استراتيجية السحب
git config pull.rebase true
# إعداد تتبع الفرع
git branch --set-upstream-to=origin/main main
# التحقق من التكوين
git config --list --local
استكشاف مشاكل الاستنساخ وإصلاحها
المشكلة: "Permission denied (publickey)"
السبب: مفتاح SSH غير معد أو لم يتم إضافته إلى GitHub
الحل:
# إنشاء مفتاح SSH
ssh-keygen -t ed25519 -C "your_email@example.com"
# إضافة إلى ssh-agent وحساب GitHub
# أو استخدم HTTPS بدلاً من ذلك
المشكلة: "fatal: repository not found"
السبب: عنوان URL خاطئ أو لا يوجد وصول إلى المستودع
الحل:
# تحقق من صحة عنوان URL
# تحقق من أن المستودع موجود ولديك وصول
# للمستودعات الخاصة، تأكد من إعداد المصادقة
المشكلة: الاستنساخ بطيء جداً
الحل:
# استخدم النسخة الضحلة
git clone --depth=1 https://github.com/user/repo.git
# أو استخدم فرعاً واحداً
git clone --single-branch https://github.com/user/repo.git
المشكلة: "RPC failed; curl transfer closed"
السبب: مستودع كبير أو مشاكل في الشبكة
الحل:
git config --global http.postBuffer 524288000
git clone https://github.com/user/repo.git
تمرين عملي:
الاستنساخ والاستكشاف:
# 1. استنساخ أساسي (استخدم أي مستودع عام)
git clone https://github.com/octocat/Hello-World.git
cd Hello-World
# 2. استكشاف المستودع المستنسخ
git remote -v
git branch -a
git log --oneline -10
# 3. جرب النسخة الضحلة
cd ..
git clone --depth=1 https://github.com/octocat/Hello-World.git shallow-repo
cd shallow-repo
git log --oneline # يعرض فقط الالتزامات الحديثة
# 4. استنساخ فرع محدد
cd ..
git clone -b main --single-branch https://github.com/octocat/Hello-World.git single-branch
cd single-branch
git branch -a # يعرض فقط فرع main
# 5. الاستنساخ باسم دليل مخصص
cd ..
git clone https://github.com/octocat/Hello-World.git my-custom-name
cd my-custom-name
# 6. التحقق من جميع النسخ
cd ..
ls -la
أفضل ممارسات الاستنساخ
✓ استخدم HTTPS للمستودعات العامة (أسهل)
✓ استخدم SSH للمستودعات التي ستدفع إليها بشكل متكرر
✓ استخدم النسخ الضحلة لـ CI/CD والنشر
✓ استنسخ فروعاً محددة عند العمل على ميزة
✓ كوّن هوية Git فوراً بعد الاستنساخ
✓ قم بإعداد المستودع البعيد upstream للمستودعات المتشعبة
✓ استخدم --recurse-submodules إذا كان المشروع يحتوي على وحدات فرعية
✓ تحقق من اكتمال الاستنساخ بنجاح قبل العمل
✗ لا تستنسخ في مستودعات Git موجودة
✗ لا تستنسخ بالبروتوكول الخاطئ (تحقق من قواعد جدار الناري)
✗ تجنب استنساخ مستودعات كبيرة جداً بدون خيار ضحل
الاستنساخ مقابل Fork مقابل التنزيل
الاستنساخ:
- ينشئ نسخة محلية من المستودع
- يحافظ على الاتصال بالمستودع البعيد
- يمكن دفع/سحب التغييرات
- وظائف Git الكاملة
- الأمر: git clone
Fork (ميزة GitHub/GitLab):
- ينشئ نسختك الخاصة على GitHub
- مستودع مستقل تحت حسابك
- يستخدم للمساهمة في المشاريع
- يمكن إنشاء طلبات سحب
- يتم عبر واجهة الويب
تنزيل ZIP:
- يقوم بتنزيل الملفات الحالية فقط
- لا يوجد سجل Git
- لا يوجد اتصال بالمستودع البعيد
- ليس مستودع Git
- لا يمكن دفع/سحب التغييرات
- يستخدم للوصول السريع للملفات
الملخص
في هذا الدرس، تعلمت:
- git clone ينشئ نسخة محلية كاملة من مستودع بعيد
- الاستنساخ يقوم تلقائياً بإعداد المستودع البعيد "origin" والفرع الافتراضي
- استخدم --depth للنسخ الضحلة (أسرع، مساحة أقل)
- استنسخ فروعاً محددة باستخدام علامة -b
- المستودعات العارية ليس لديها دليل عمل (للاستخدام على الخادم)
- نسخ المرآة تنشئ نسخاً طبق الأصل بما في ذلك جميع المراجع
- HTTPS أسهل، SSH أكثر ملاءمة بعد الإعداد
- كوّن هوية Git والمستودعات البعيدة بعد الاستنساخ
- استخدم --recurse-submodules للمشاريع ذات الوحدات الفرعية
التالي: في الدرس التالي، سنستكشف العمل مع الوسوم لوضع علامات على النقاط المهمة في سجل مشروعك!