Git Patches

تحدثت في المقاله السابقه عن Git Bundle’s وعن طريقة نقل مستودع بالكامل ولكن في بعض الاحيان كل التعديلات الجديده مقتصره على فرع واحد وغير معقده.

ولهذا يقدم لنا Git الامر format-patch والذي يقوم بإنشاء ملف او عدة ملفات (لكل commit ملف منفصل) تحتوي على سجل للتعديلات والتي يمكن اعتمادها على نسخه اخرى من المشروع حتى لو لم تُستخدم Git لادارة النسخ فيه.

الامر السابق يوفر لنا طريقتين للتعامل معه

  1. إنشاء ملف لكل commit
  2. إنشاء ملف واحد يجمع كل ال commits

سأقوم بتنفيذ الامر التالي لانشاء patch

git format-patch 340c9e89..master

والذي سيقوم بدوره بإنشاء ملف لكل commit كالتالي

0001-update-ar-translation.patch
0002-update-README.patch
0003-upgrade-libraries.patch
0004-fix-invalid-date.patch
0005-add-auto-email-reminder.patch

او بتنفيذ الامر التالي

git format-patch 340c9e89..master --stdout > last-5-commits.patch

والذي سيقوم بإنشاء ملف بأسم last-5-commits.patch ويحتوي على كل ال commits السابقه في ملف واحد

ويمكن اعتماد الpatches بأحدى الطريقتين

  1. git apply last-5-commits.patch
  2. git am last-5-commits.patch

سيقوم الامر الاول باعتماد التعديلات في المشروع الحالي ولكن يجب ايداع التغييرات الجديده (لايشترط ان يكون المشروع الحالي يعمل على Git).

اما الامر الثاني فسيقوم باعتماد التعديلات في المشروع الحالي مع ايداع التغييرات وسيكون جاهز للدفع الى الخادم.

Git Bundle’s

في إحدى المرات طُلب مني تثبيت نظام يجري تطويره لاحدى الشركات في خادم غير متصل بالانترنت (لإسباب امنيه).

ولإن النظام قيد التطوير فإن التحديثات كانت شبه يوميه وفي هذه الحاله لايمكن الاعتماد على ضغط المشروع ونقله في كل مره يتم تحديث النظام لعدة اسباب.

  1. لايوجد سجل للتغييرات وفي حالة حدوث خطاء فادح لا يمكن الرجوع الى اقرب نسخه مستقره.
  2. نقل الملفات التي تم تحديثها طريقه غير عمليه ولايمكن الاعتماد عليها لما تسببه من اخطاء في حالة نسيان احدى الملفات.
  3. نقل المشروع بالكامل في كل مره يتم تحديثه يتطلب وقت اطول لنقله وإعداده.

ولحسن الحظ فإن Git توفر حل لمثل هذه الحالات وهو الامر bundle

مايقوم به الامر السابق هو تحزيم كامل للمشروع مع ما يحتويه من tags,history,branches في ملف قابل للنقل والاستخدام كما لو كنت تتعامل مع خادم Git.

إنشاء حزمه جديده

لإنشاء حزمه من المشروع الحالي بالامر التالي

git bundle create project.git master development

سيقوم الامر السابق بإنشاء حزمه للمشروع للفرعين master و development.

ولإنشاء حزمه لجميع الفروع مرر الخيار all كالتالي

git bundle create project.git --all

سينتج ملف بأسم project.git قابل للنقل.

يٌفضل إنشاء tag لتعليم اخر نسخه قُمت بتحزيمها بالامر التالي

git tag v0.1.5-alpha

ولإستيراد الحزمه نفذ الامر التالي

git clone project.git project

سيقوم الامر السابق بإستيراد المشروع في المجلد project. ويمكنك التعامل مع المشروع كما لو كنت تتعامل مع خادم Git.

وعند تنفيذ الامر git remote -v . سيعرض لي المصادر التي يعتمد عليها المشروع كالتالي

origin	/home/USER/lab/git/test/project.git (fetch)
origin	/home/USER/lab/git/test/project.git (push)

في المره القادمه عند إنشاء حزمه جديده للمشروع ضعها في المسار/home/USER/lab/git/test/project.git.

عند وجود تحديثات جديده, امامنا خيارين

  1. إعادة تحزيم المشروع من جديد (إذا كانت تعديلاتك معقده وفي عدة فروع).
  2. إنشاء Patch (إذا كانت تعديلاتك مقتصره على فرع واحد وتحتوي على عدة commits).

إعادة تحزيم المشروع

بما ان v0.1.5-alpha هو اخر tag قُمت بإنشائه. سأنفذ الامر التالي

git bundle create project.git v0.1.5-alpha..master --since=3.days.ago development

والذي بدوره سيقوم بتحزيم

  • التعديلات التي طرئت في الفرع master منذ إنشاء v0.1.5-alpha حتى اخر تعديل
  • التعديلات التي طرئت على الفرع development خلال اخر 3 ايام.

وانقل الملف الى المسار المطلوب.

وللتاكد من صلاحية الملف وتوافقه مع المشروع الحالي نفذ الامر التالي

git bundle verify /home/USER/lab/git/test/project.git

ثم git pull لسحب اخر التعديلات .

يتبع Git Patch