اذهب إلى المحتوى

كيفية إدارة الكائنات الثنائية Binary Blobs باستخدام جيت Git


هدى جبور

تحدثنا في المقالات السابقة عن كيفية التحكم في الإصدار من خلال جيت بالنسبة للملفات النصية فقط، لكن ماذا عن الملفات الثنائية؟ جيت لديها بعض الإضافات التي تمكنها من التعامل مع هذا النوع من الملفات، وهذا هو موضوع المقال الأخير من هذه السلسلة.

تعامل جيت git مع الكائنات الثنائية المصدرية Binary Blobs

جميع المستخدمين يتفقون على أن جيت أداة محدودة القدرة في التعامل مع الكائنات الثنائية المصدرية، ولا سيما الكبيرة منها، ولقد أشرنا إلى ذلك في المقال الأول. تجدر الملاحظة إلى أنه بإمكانك استخدام جيت مع الملفات النصية الكبيرة جدًا دون مشاكل، لكن مع ملف ثنائي فالأمر مختلف، فجيت في هذه الحالة لا تستطيع معاملته إلا كصندوق أسود كبيرة وتحفظه كما هو.

لنفترض أن لديك نموذجًا معقدًا ثلاثي الأبعاد يمثل لعبة ألغاز جديدة تصنعها، وحفظته بصيغة ثنائية ونتج ملف بسعة 1 جيجابايت، ثم نفذت عملية إيداع للملف، أي أنك أضفت 1 جيجابايت كاملة إلى سجل مستودعك. لاحقًا قررت إجراء بعض التعديلات على هذا النموذج، وبالفعل قمت بتعديل لون شعر النموذج وتريد أن تقوم بتنفيذ عملية إيداع مرة أخرى؛ وهنا لا يمكن لجيت تمييز اللون ولا حتى معرفة فيما إذا غيرت لون الشعر فقط أو أنك غيرت لون كامل النموذج، وهذه مشكلة، لأن جيت في هذه الحالة سيخصص غيغابايت جديدة بالكامل لهذا الإيداع، وربما تقرر لاحقًا تغيير لون عينه أو شكل رأسه، ومع كل مرة ننفذ عملية إيداع نستهلك جيجابايت جديدة بالرغم من أن التعديلات طفيفة للغاية، وهذه مشكلة خطية. بينما لو قارنت ذلك بملف نصي مهما كان تنسيقه، فستجد أن الأمر مختلف تمامًا، فجيت في حالة الملفات النصية يستطيع فهم التعديلات، وبدل أن يقوم بحفظ كامل الملف مرة أخرى بعد كل عملية إيداع تُجريها، فإنه يقوم بالتعديل على النسخة السابقة فقط. عمومًا، هناك حاجة كبيرة لاستخدام الملفات الثنائية عند العديد من المستخدمين، لذا ظهرت العديد من الحلول.

يعد Git Large File Storage (اختصارًا LFS) مشروعًا مفتوح المصدر من جيت هاب بدأ كفرع من Git-media، إذ Git-media و git-annex هما إضافات لجيت يهدفان إلى إدارة الملفات الكبيرة، وكل منهما له طريقته الخاصة وميزاته التي يتفرد بها، والتالي يمثل بعضًا منها:

  • Git-annex هو نظام مزامنة ملفات موزع يسمح لك بإدارة الملفات الكبيرة، حيث تُنشئ أنت والمستخدمين مستودعاتكم الخاصة ويكون لكل مستودع مجلد محلي ‎.git/annex يتم فيه تخزين الملفات الكبيرة. تتم مزامنة كل شيء بانتظام وبالتالي كل البيانات اللازمة تكون متاحة لجميع المستخدمين. افتراضيًا يفضل git-annex التخزين المحلي قبل التخزين خارج الموقع، لكن يمكنك تغيير ذلك من خلال annex-cost.
  • Git-portal هو أيضًا نظام مزامنة ملفات موزع، وكما هو الحال في git-annex لديها خيار المزامنة مع موقع مركزي، ويستخدم أدوات مساعدة شائعة، مثل باش Bash وجيت وبرنامج rsync.
  • Git-LFS هو نموذج مركزي، ومستودع للملفات والبيانات المشتركة. أنت تخبر Git-LFS أين هو المكان الذي يتم فيه تخزين ملفاتك الكبيرة، سواء كان على قرص صلب أو مخدم أو خدمة تخزين سحابية، ويتعامل كل مستخدم في مشروعك مع هذا المكان باعتباره الموقع الرئيسي المركزي للملفات الكبيرة.

نموذج git-portal

يؤمن Git-portal لجيت إمكانية إدارة الكائنات الثنائية باستخدام أدوات يونكس الأساسية مثل باش وجيت نفسها وبرنامج rsync اختياريًا. ينسخ Git-portal الملفات الثنائية الكبيرة إلى وحدة تخزين محلية أو خارجية (بعيدة)، ويعطيك روابط لينة symlinks يمكنك إيداعها جنبًا إلى جنب مع بقية ملفات مشروعك.

إنه أداة بسيطة عمومًا، ويتطلب تنفيذ إجراءات يدويًا أحيانًا، مثلًا لا تحتوي على جامع مهملات (إجرائية لتتبع البيانات غير المستخدمة والتي تستهلك الموارد مثل الذاكرة)، وبالتالي يجب عليك القيام بذلك يدويًا، وهو أداة مثالية للمستخدمين الذين يحتاجون إلى إدارة الملفات الكبيرة والتي من الصعب أو غير الممكن إداراتها من خلال جيت، وهي لا تختلف عن جيت إلا ببعض الأمور البسيطة جدًا، لذا فتعلمه لن يكون عائقًا على الإطلاق.

يمكنك تثبيت Git-portal من صفحة المشروع الخاصة به على جيت لاب.

كل أوامر هذه الأداة تعكس الأوامر المستخدمة في جيت، فمثلًا لاستخدام Git-portal في مشروع:

$ git-portal init

لإضافة ملف وليكن مثلًا bigfile.png وهو صورة كبيرة الحجم، ننفذ الأمر التالي:

$ git-portal add bigfile.png

بمجرد إرسال الملف من خلال الأمر السابق، تكون باقي العمليات التي قد تحتاج إلى إجرائها هي ذاتها التي تستخدمها في جيت، وهنا تضيف ملفات كالمعتاد، إلا أنك تكون غافل نسبيًا عن حقيقة أن بعضها عبارة عن روابط لينة سريّة للمجلد ‎portal_‎.

كل شيء موجود في المجلد ‎portal‎ (والذي يتجاهله جيت تمامًا) يمكن نسخه احتياطيًا إلى أي وحدة تخزين تريدها سواء كانت قرص صلب أو خادم بعيد. بما أن Git-portal يوفر استخدام الخطافات (برامج يتم تشغيلها قبل أو بعد أحداث معينة، مثل الدفع أو السحب أو الإيداع) بالتالي يمكنك إن أحببت بناء إعداد خاص لمزامنة المجلد ‎portal‎ الخاص بك تلقائيًا مع موقع بعيد:

$ git remote add _portal alice@myserver.com:/home/alice/umbrella.git/_portal

يتميز Git-portal بكونه نظامًا بسيطًا ومبتكرًا يعتمد على نظام لينكس، ويمكّنك من إدارة مشروعك ومشاركته مع الآخرين من خلال مجموعة صغيرة من الأدوات والأوامر، وقد تم استخدامه في العديد من المشاريع التي تتضمن الوسائط وألعاب الفيديو ومدونات الألعاب لإدارة كل شيء بدءًا من الصور البسيطة إلى ملفات PDF الكبيرة وحتى النماذج ثلاثية الأبعاد.

نموذج git-annex

يمتلك git-annex مسار عمل مختلف قليلًا، لكن الأفكار الأساسية هي نفسها، ويعتبر نظام مزامنة ملفات موزع يهدف إلى حل مشكلة إدارة ومشاركة ومزامنة الملفات الكبيرة دون الحاجة إلى خدمة تجارية أو حتى خادم مركزي، فهو يجعلك قادرًا على إدارة الملفات الكبيرة على جيت من دون تخزين محتوياتها في جيت. يجب أن تكون قادرًا على تثبيت git-annex من مستودع البرامج software repo، أو يمكنك الحصول عليه من موقعهم على الويب. كما هو الحال مع git-media، يجب على أي شخص يستخدم git-annex تثبيته على جهازه.

الإعداد الأولي أبسط من git-media. لإنشاء مستودع مجرد bare repository على خادمك، نفّذ هذا الأمر مع استبدال المسار الظاهر بالمسار الخاص بك:

$ git init --bare --shared /opt/jupiter.git

ثم انسخه على حاسوبك المحلي، وميّزه كموقع git-annex خاص:

$ git clone seth@example.com:/opt/jupiter.clone
Cloning into 'jupiter.clone'... warning: You appear to have cloned
an empty repository. Checking connectivity... done.
$ git annex init "seth workstation" init seth workstation ok 

بدلًا من استخدام المرشحات filters لتحديد أماكن وجود ملفات الوسائط أو الملفات الكبيرة، يمكنك استخدام الأمر التالي لإضافة الملفات إلى git annex وهو تلقائيًّا يحديد فيما إذا كانت كبيرة أم لا:

$ git annex add bigblobfile.flac
add bigblobfile.flac (checksum) ok
(Recording state in Git...)

الآن تنفيذ عملية الإيداع كالمعتاد بدون اختلاف يذكر:

$ git commit -m 'added flac source for sound fx'

لكن عملية الدفع مختلفة، لأن git-annex تستخدم فرعها الخاص لتتبع الملفات، لذلك عند تنفيذ عملية دفع لأول مرة ربما تحتاج لإضافة الخيار u-، وذلك اعتمادًا على كيفية إدارتك لمستودعك:

$ git push -u origin master git-annex
To seth@example.com:/opt/jupiter.git
* [new branch] master -> master
* [new branch] git-annex -> git-annex 

كما هو الحال مع git-media، فإن عملية الدفع العادية لا تنسخ ملفاتك إلى الخادم وإنما ترسل فقط معلومات تتعلق بالوسائط. أخيرًا عندما تكون جاهزًا لمشاركة الملفات مع باقي أعضاء الفريق، نفّذ أمر المزامنة sync:

$ git annex sync --content

إذا شارك شخص آخر الملفات مع الخادم واحتجت إلى سحبها، فإن الأمر git annex sync سيسحب الملفات غير الموجودة على جهازك والموجودة على الخادم.

يعتبر Git Annex حلًا مضبوطًا بدقة لإدارة الملفات الكبيرة وهو مرن وسهل الاستخدام ومتيّن (قليل الأخطاء) وتم اختباره جيدًا.

نموذج git-lfs

كُتِب git-lfs بلغة Go، ويمكنك تثبيته من الشيفرة المصدر أو كملف ثنائي يتم تنزيله وتثبيته على جهازك، وكافة تعليمات التثبيت موجودة على الموقع، وهو برنامج متعدد المنصات cross-platform لذا لن تواجه مشاكل في عمله وتثبيته على مختلف أنواع الأنظمة.

بعد تثبيته يمكنك تحديد أنواع الملفات التي تريد أن يتجاهلها جيت ويديرها Git-LFS، مثلًا لكي يتتبع Git-LFS جميع الملفات التي تحمل الامتداد png. نكتب:

$ git lfs track "*.png"

في كل مرة تضيف فيها نوع جديد من الملفات لكي يتتبعها Git-LFS، يجب عليك إضافة ثم إيداع الملف gitattributes. كما يلي:

$ git add .gitattributes
$ git commit -m "LFS track *.png"

عندما تغير حالة ملف من هذه الأنواع ليصبح ملف مرحلي (مُدرج)، يُنسَخ الملف إلى git/lfs..

Git-LFS هو مشروع لشركة جيت هاب وهو مرتبط كثيرًا ببنيتها، وإذا كنت ترغب في تشغيل خادم جيت يسمح بدمج Git-LFS، فيمكنك الاطلاع على المثال الموجود في: lfs-test-server من github.

يتميز git-portal و git-annex بالمرونة ويمكنهما استخدام المستودعات المحلية بدلًا من الخادم، وهذا مفيد لإدارة المشاريع المحلية الخاصة.

الملفات الكبيرة وجيت

بالرغم من أن جيت مخصص للعمل مع الملفات النصية، فهذا لا يعني أنه لا يمكنك استخدامه مع الأنواع الأخرى من الملفات، حيث توجد الكثير من الحلول لمساعدتك في إدارة كافة أنواع الملفات، لذا اذهب وجرب جيت بدءًا من اليوم!

ترجمة -وبتصرف- للمقال How to manage binary blobs with Git لصاحبه Seth Kenlon.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...