الحزمة والأرشيف
طريقتان لوضع مستودع كامل في ملف واحد. تبدوان قابلتين للتبادل، وهما ليستا كذلك، واختيار الخاطئة منهما هو السبب الكامل لوجود هذه الصفحة.
| حزمة | أرشيف | |
|---|---|---|
| يحوي | السجل: الالتزامات والفروع والوسوم | الملفات عند التزام واحد |
| يُفتح بواسطة | git clone / git fetch — فهو مستودع بعيد فعليًا |
أي أداة فك ضغط |
| بعد ذلك | يمكنك الجلب منه مجددًا والدمج ومواصلة العمل | لا شيء. إنه لقطة جامدة |
| يُستخدم لـ | نقل العمل إلى حاسوب بلا شبكة | «أرسل لي الشيفرة عند v2.1» |
⌘K ← احزم المستودع أو صدّر أرشيفًا.

الحزم
الحزمة هي جواب git عن فجوة لا تعبرها أي شبكة: حاسوب معزول، ذاكرة USB، مرفق
بريد إلكتروني، حاسوب محمول على متن طائرة. الطرف المستقبِل يشغّل
git clone work.bundle myrepo فيحصل على مستودع حقيقي، بسجلك وفروعك، يجلب من
ذلك الملف كما لو كان خادمًا.
ثلاثة نطاقات:
| النطاق | ما الذي يسافر | الحجم |
|---|---|---|
| كل شيء | كل فرع وكل وسم، والسجل كاملًا | المستودع بأكمله |
| فرع أو وسم واحد | ذلك المرجع وكل ما يصل إليه | معظمه عادةً |
| نطاق من الالتزامات | ما بين الطرفين فقط | صغير |
حزمة النطاق رقعة من السجل، لا مستودع. فهي تسجّل الطرف البعيد بوصفه متطلبًا مسبقًا: يرفض git فتحها في مستودع لا يملك ذلك الالتزام أصلًا، لأنه لن يكون هناك ما تُعلَّق عليه الالتزامات الجديدة. هذا هو السلوك الصحيح، وهو مفاجأة في المرة الأولى. استخدم النطاق حين يكون لدى الطرف الآخر عملك حتى نقطة ما — الوسم الذي استلمه أخيرًا، أو الالتزام الذي تفرّعتما منه معًا.
استقبال حزمة
استورد حزمة… يقرأ الملف، ويسرد ما يحويه، ويقول لك مقدَّمًا ما إذا كان هذا المستودع قادرًا على استخدامها — فإن كانت المتطلبات المسبقة ناقصة، يخبرك بعددها بدل أن يفشل لاحقًا بصياغة git الخاصة.
المراجع المستوردة تحطّ تحت bundle/…، في فضاء أسماء التتبّع البعيد. لا شيء
محلي يتحرك: لا فرع يُقدَّم تقديمًا سريعًا، ولا عمل يُكتب فوقه. بعدها تدمج أو
تعيد الأساس أو تسحب bundle/main وفق شروطك أنت، تمامًا كما تفعل مع فرع قادم من
أي مستودع بعيد آخر.
ولبدء مستودع جديد من حزمة بدل ذلك، استنسخ من الملف في الطرفية:
git clone work.bundle myrepo. يستورد Gitcito إلى مستودع مفتوح؛ وهو لا يستنسخ
من ملف.
الأرشيفات
يكتب git archive الشجرة عند التزام واحد بصيغة zip أو tarball. بلا .git،
وبلا سجل، وبلا أي طريقة للجلب منه — وهذا هو المقصود بالضبط حين يُفترض أن يحصل
المستلِم على شيفرة مصدرية، لا على مستودع.
| الخيار | ما الذي يفعله |
|---|---|
| المرجع | الفرع أو الوسم أو الالتزام المراد تصديره. الوسم هو الجواب المعتاد |
| الصيغة | zip أو tar.gz أو tar |
| التغليف في مجلد | يضيف مجلدًا في المستوى الأعلى، فلا ينثر فك الضغط الملفات في كل مكان |
| هذا المسار فقط | صدّر مجلدًا فرعيًا واحدًا بدل الشجرة كاملة |
خاصية export-ignore هي سبب استخدام هذا
يستطيع المستودع أن يعلّم مسارات في .gitattributes:
.github/ export-ignore
test/ export-ignore
*.psd export-ignore
تلك المسارات تُترك خارج كل أرشيف مع بقائها في المستودع. هكذا يشحن مشروع ما حزمة إصدار من دون إعدادات التكامل المستمر ولا ملفات الاختبار ولا ملفات التصميم البالغة 200 ميغابايت، مع بقاء القاعدة داخل المستودع بدل أن تعيش في سكربت إصدار عند أحدهم.
حدود تستحق المعرفة
- الحزمة نسخة كاملة ما لم تستخدم نطاقًا. حزم مستودع بحجم 2 غيغابايت يكتب ملفًا بحجم 2 غيغابايت، ويستغرق ما يستغرقه استنساخ.
- الحزم الفارغة مرفوضة من git لا من Gitcito: نطاق لا شيء بين طرفيه ينتج خطأً بدل ملف عديم الفائدة.
- الاستيراد لا يدمج. تصل المراجع تحت
bundle/…وتبقى هناك حتى تفعل بها شيئًا. - الأرشيف بلا سجل، فلا يمكن تحويله ثانيةً إلى مستودع. إن كان المستلِم سيحتاج إلى الالتزام، فأرسل حزمة.
export-ignoreتؤثر في الأرشيفات فقط. فهي لا تخفي شيئًا عن استنساخ ولا عن حزمة ولا عن السجل — ولهذا انظر إزالة ملف من السجل.
انظر أيضًا: المزامنة · مشاركة آمنة · إزالة ملف من السجل