سؤال

أنا أبحث عن آراء حول كيفية التعامل مع الملفات الثنائية الكبيرة التي يعتمد عليها شفرة المصدر (تطبيق الويب). نحن نناقش حاليا العديد من البدائل:

  1. انسخ الملفات الثنائية باليد.
    • برو: غير متأكد.
    • كونترا: أنا قوي ضد هذا، لأنه يزيد من احتمالية الأخطاء عند إعداد موقع جديد / ترحيل القديم. بناء عقبة أخرى لاتخاذ.
  2. إدارة لهم جميعا مع شخص سخيف.
    • Pro: يزيل إمكانية "نسخ" لنسخ ملف مهم
    • Contra: Bloats المستودع ويقلل المرونة لإدارة قاعدة التعليمات البرمجية والخروجات، والملاءات المتعددة، وما إلى ذلك سوف يستغرق بعض الوقت.
  3. مستودعات منفصلة.
    • PRO: التحقق من / استنساخ التعليمات البرمجية المصدر سريعة كما كانت دائما، والصور أرشفة بشكل صحيح في مستودعها.
    • كونترا: يزيل تباطؤ وجود الواحد و الوحيد مستودع جيت في المشروع. بالتأكيد يقدم بعض الأشياء الأخرى التي لم أفكر فيها.

ما هي تجاربك / أفكارك فيما يتعلق بهذا؟

أيضا: هل لدى أي شخص خبرة في مستودعات متعددة الجيت وإدارةها في مشروع واحد؟

الملفات هي صور لبرنامج يقوم بإنشاء ملفات PDF مع تلك الملفات فيها. لن تتغير الملفات في كثير من الأحيان (كما في السنوات)، لكنها ذات صلة للغاية ببرنامج. لن يعمل البرنامج بدون الملفات.

هل كانت مفيدة؟

المحلول

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

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

هنا جيدة مقدمة في الأسفل من كتاب جيت.

نصائح أخرى

اكتشفت جيت- الملحق في الآونة الأخيرة التي أجدها رهيبة. تم تصميمه لإدارة الملفات الكبيرة بكفاءة. يمكنني استخدامها لمجموعات الصور / الموسيقى (إلخ). تطور جيت الملحق نشط للغاية. يمكن إزالة محتوى الملفات من مستودع GIT، يتم تعقب التسلسل الهرمي للشجرة فقط بواسطة GIT (من خلال Symlinks). ومع ذلك، للحصول على محتوى الملف، هناك خطوة ثانية ضرورية بعد السحب / الدفع، على سبيل المثال:

$ git annex add mybigfile
$ git commit -m'add mybigfile'
$ git push myremote
$ git annex copy --to myremote mybigfile ## This command copies the actual content to myremote
$ git annex drop mybigfile ## Remove content from local repo
...
$ git annex get mybigfile ## Retrieve the content
## or to specify the remote from which to get:
$ git annex copy --from myremote mybigfile

هناك العديد من الأوامر المتاحة، وهناك وثائق رائعة على الموقع الإلكتروني. حزمة متوفرة دبيان.

حل آخر، منذ أبريل 2015 هو تخزين ملفات كبيرة GIT (LFS) (بواسطة جيثب).

ويستخدم ذلك git-lfs. (يرى git-lfs.github.com.) واختبارها مع خادم يدعم ذلك: LFS-Test-Server:
يمكنك تخزين البيانات الوصفية فقط في Repo Git، والملف الكبير في مكان آخر.

https://cloud.githubusercontent.com/assets/1319791/7051226/c4570828-ddf4-11e4-87eb-8fc165e5ece4.gif

القي نظرة على بوابة BP. وهو ملحق GIT لتخزين الثنائيات الكبيرة بذكاء في مستودع جيت.

تريد أن تحصل عليه كخضور، لكنك لن تقلق بشأن المستودع يصعب التعامل معه. واحدة من حالات استخدام العينات الخاصة بها تخزن صور VM في GIT.

لم أر فعلا معدلات ضغط أفضل، لكن مستودعاتي ليس لديها ثنائيات كبيرة حقا فيها.

قد تختلف الأميال الخاص بك.

تستطيع ايضا استخذام جيت الدهون. وبعد أنا أحب ذلك يعتمد فقط على الأسهم بيثون و rsync. وبعد كما يدعم سير العمل المعتاد بوابة الجيت، مع أوامر توضيحية ذاتية التالية:

git fat init
git fat push
git fat pull

بالإضافة إلى ذلك، تحتاج إلى التحقق من ملف .gitfat في مستودعك وتعديل .gitattributes لتحديد ملحقات الملفات التي تريدها git fat لإدارة.

يمكنك إضافة ثنائي باستخدام العادي git add, ، والتي بدوره يستدعي git fat بناء على قواعد gitattributes الخاص بك.

أخيرا، يتمتع بميزة أن الموقع الذي يتم فيه تخزين ثنائلك المخزنة بالفعل عبر مستودعات ومستخدمين ويدعم أي شيء rsync هل.

تحديث: لا تستخدم GIT-FAT إذا كنت تستخدم جسر GIT-SVN. سينتهي الأمر بإزالة الملفات الثنائية من مستودع التخريب الخاص بك. ومع ذلك، إذا كنت تستخدم مستودع جيت نقي، فإنه يعمل بشكل جميل.

أود استخدام الأساس (كبات Notz) أو مستودعتين متميزين. إذا قمت بتعديل ملفاتك الثنائية في كثير من الأحيان، فسأحاول تقليل تأثير مستودع الضخم تنظيف التاريخ:

كان لدي مشكلة مماثلة للغاية منذ عدة أشهر: ~ 21 غيغابايت من ملفات MP3، غير مصنف (أسماء سيئة، Bad ID3، لا أعرف ما إذا كنت أحب ملف MP3 أو لا ...، وتكرارها على ثلاثة أجهزة كمبيوتر.

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

في النهاية، كان لدي فقط ~ 6 غيغابايت من ملفات MP3 و 83 جيجابايت في دليل .git. انا إستعملت git-write-tree و git-commit-tree لإنشاء ارتكاب جديد، دون الالتزام بأسلاف، وبدأ فرع جديد يشير إلى ذلك الالتزام. أظهر "سجل جيت" لهذا الفرع فقط ارتكاب واحد.

بعد ذلك، حذفت الفرع القديم، وحفظ الفرع الجديد فقط، وحذف سجلات REF-REF-REF-PRUNS "، وتشغيل" Git Prung ": بعد ذلك، مجلداتي .git المرجح

يمكنك "تطهير" المستودع الضخم من وقت لآخر بنفس الطريقة: سيكون "استنساخ جيت" أسرع.

في رأيي، إذا كنت من المرجح أن تقوم بتعديل تلك الملفات الكبيرة في كثير من الأحيان، أو إذا كنت تنوي أن تكسب الكثير من git clone أو git checkout, ، ثم يجب أن تفكر بجدية في استخدام مستودع آخر جيت (أو ربما طريقة أخرى للوصول إلى تلك الملفات).

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

يعتمد الحل الذي أود اقتراحه على فروع اليتيم وإساءة معاملة خفيفة لآلية العلامة، من الآن فصاعدا باسم * العلامات اليتية تخزين ثنائي (Otabs)

TL؛ Dr 12-01-2017 إذا كنت تستطيع استخدام LFS's Github أو بعض الطرف الثالث الآخر، فكل الوسائل التي يجب عليك. إذا كنت لا تستطيع، ثم قرأت. التحذير، هذا الحل هو الاختراق وينبغي معاملة على هذا النحو.

خصائص المرغوب فيه من Otabs

  • إنها بوابة نقية و بوابة فقط الحل - يحصل على الوظيفة التي تم إنجازها دون أي برنامج طرف ثالث (مثل GIT-Annex) أو البنية التحتية للطرف الثالث (مثل Github's LFS).
  • يخزن الملفات الثنائية بكفاءة, ، أي أنها لا تنفخ تاريخ مستودعك.
  • git pull و git fetch, ، بما فيها git fetch --all لا تزال عرض النطاق الترددي الفعال, ، لم يتم سحب جميع الثنائيات الكبيرة من جهاز التحكم عن بعد بشكل افتراضي.
  • يعمل على ذلك شبابيك.
  • يخزن كل شيء في مستودع جيت واحد.
  • انها تسمح ل حذف من الثنائيات التي عفا عليها الزمن (على عكس buP).

خصائص غير مرغوب فيها من Otabs

  • التي تجعل git clone من المحتمل أن تكون غير فعالة (ولكن ليس بالضرورة، اعتمادا على استخدامك). إذا قمت بنشر هذا الحل قد تضطر إلى تقديم المشورة لزملائك للاستخدام git clone -b master --single-branch <url> بدلا من git clone. وبعد وذلك لأن git استنساخ افتراضيا الحيوانات المستنسخة حرفيا بأكمله مستودع، بما في ذلك الأشياء التي لن ترغب عادة في إضاعة النطاق الترددي الخاص بك، مثل ارتكابها غير عرضة. مأخوذ من حتى 4811434..
  • التي تجعل git fetch <remote> --tags عرض النطاق الترددي غير فعال، ولكن ليس بالضرورة غير فعالة. يمكنك دائما تقديم المشورة لزملائك بعدم استخدامه.
  • عليك أن تستخدم بشكل دوري git gc خدعة لتنظيف مستودعك من أي ملفات لا تريدها بعد الآن.
  • انها ليست فعالة مثل BP. أو git-bigfiles.. وبعد لكن الأمر أكثر ملاءمة على التوالي لما تحاول القيام به وأكثر من الرف. من المحتمل أن تواجه مشكلة مع مئات الآلاف من الملفات الصغيرة أو مع الملفات في نطاق الجيجابايت، ولكن القراءة عن الحلول.

إضافة الملفات الثنائية

قبل البدء في التأكد من أنك قد ارتكبت كل تغييراتك، فإن شجرة العمل الخاصة بك محدثة ومؤشرك لا يحتوي على أي تغييرات غير ملتزم بها. قد تكون فكرة جيدة دفع جميع فروعك المحلية إلى جهاز التحكم عن بعد (Github وما إلى ذلك) في حالة حدوث أي كارثة.

  1. إنشاء فرع الأيتام جديد. git checkout --orphan binaryStuff سوف تفعل الخدعة. هذا ينتج فرعا غير متصل تماما من أي فرع آخر، والالتزام الأول الذي ستجعله في هذا الفرع لن يكون له أحد الوالدين، مما يجعله ارتكاب الجذر.
  2. تنظيف الفهرس الخاص بك باستخدام git rm --cached * .gitignore.
  3. تأخذ نفسا عميقا وحذف شجرة العمل بأكملها باستخدام rm -fr * .gitignore. وبعد داخلي .git سيبقى الدليل لا يمسه، لأن * البدل لا يتطابق معها.
  4. نسخ في verybigbinary.exe، أو veryheavydirectory /.
  5. أضفها && ارتكبها.
  6. الآن يصبح صعبا - إذا دفعته إلى جهاز التحكم عن بعد كفرع، فسوف يقوم جميع المطورين بتنزيله في المرة القادمة التي يحصلون عليها git fetch انسداد اتصالهم. يمكنك تجنب ذلك عن طريق الضغط على علامة بدلا من فرع. لا يزال بإمكان هذا تأثير عرض النطاق الترددي لزميلك وتخزين نظام الملفات إذا كان لديهم عادة كتابة git fetch <remote> --tags, ، ولكن قرأ عن الحل البديل. المضي قدما و git tag 1.0.0bin
  7. دفع علامة الأيتام الخاص بك git push <remote> 1.0.0bin.
  8. فقط حتى لا تدفع الفرع الثنائي الخاص بك عن طريق الصدفة، يمكنك حذفها git branch -D binaryStuff. وبعد لن يتم تمييز ارتكابك لجمع القمامة، لأن علامة الأيتام يشير إليها 1.0.0bin يكفي للحفاظ عليه على قيد الحياة.

التحقق من الملف الثنائي

  1. كيف يمكنني (أو زملائي) الحصول على فحص verybigbinary.exe في شجرة العمل الحالية؟ إذا كان فرع العمل الحالي الخاص بك هو على سبيل المثال، فيمكنك ببساطة git checkout 1.0.0bin -- VeryBigBinary.exe.
  2. سيفشل هذا إذا لم يكن لديك علامة الأيتام 1.0.0bin تحميلها، في هذه الحالة عليك git fetch <remote> 1.0.0bin مسبقا.
  3. يمكنك إضافة VeryBigBinary.exe في سيدك .gitignore, ، بحيث لا أحد في فريقك سوف يلوث التاريخ الرئيسي للمشروع مع الثنائي عن طريق الصدفة.

حذف تماما الملف الثنائي

إذا قررت تطهير verybigbinary.exe تماما من مستودعك المحلي، فإن مستودعك عن بعد ومستودعات زميلك يمكنك فقط:

  1. احذف علامة الأيتام على جهاز التحكم عن بعد git push <remote> :refs/tags/1.0.0bin
  2. حذف علامة الأيتام محليا (حذف جميع العلامات الأخرى غير المعروفة) git tag -l | xargs git tag -d && git fetch --tags. وبعد مأخوذ من 1841341. مع تعديل طفيف.
  3. استخدم خدعة GIT GC لحذف الالتزام الخاص بك الآن. git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@". وبعد ستحذف أيضا كل شيء غير مجهول آخر. مأخوذ من لذلك 1904860.
  4. إذا كان ذلك ممكنا، كرر خدعة GIT GC على جهاز التحكم عن بعد. من الممكن أنه إذا كنت تستضيف مستودع المستسد الخاص بك، فقد لا يكون ذلك ممكنا مع بعض موفري GIT، مثل Github أو في بعض البيئات المؤسسية. إذا كنت تستضيف مع موفر لا يمنحك الوصول إلى جهاز التحكم عن بعد فقط، فليكن. من الممكن أن تقوم البنية التحتية للمزود بأن تنظف الالتزام غير المشروع في وقتهم الحلو. إذا كنت في بيئة مؤسسية، فيمكنك تقديمها لتشغيل القمامة الوظيفية Cron لجمع جهاز التحكم عن بعد مرة واحدة في الأسبوع أو نحو ذلك. سواء فعلوا أو لا يكون لديهم أي تأثير على فريقك من حيث النطاق الترددي والتخزين، طالما أن تنصح بزملائك دائما git clone -b master --single-branch <url> بدلا من git clone.
  5. جميع زملائك الذين يرغبون في التخلص من علامات الأيتام القديمة تحتاج فقط إلى تطبيق الخطوات 2-3.
  6. يمكنك بعد ذلك كرر الخطوات من 1-8 من إضافة الملفات الثنائية لإنشاء علامة الأيتام جديدة 2.0.0bin. وبعد إذا كنت قلقا بشأن كتابة زملائك git fetch <remote> --tags يمكنك فعلا تسمية ذلك مرة أخرى 1.0.0bin. وبعد هذا سوف يتأكد من أن المرة القادمة أحضروا جميع العلامات القديمة 1.0.0bin لن تكون غير مجهدة ومحددة لجمع القمامة اللاحقة (باستخدام الخطوة 3). عند محاولة الكتابة فوق علامة على جهاز التحكم عن بعد، يجب عليك استخدامها -f مثله: git push -f <remote> <tagname>

afterword.

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

  • أكد للعمل على ويندوز مع git-bash.

  • إنها فكرة جيدة تطبيق مجموعة من الجو القياسية لجعل تخزين الملفات الثنائية أكثر كفاءة. تشغيل متكرر من git gc (بدون أي حجج إضافية) يجعل GIT يحسن التخزين الأساسي لملفاتك باستخدام Deltas الثنائية. ومع ذلك، إذا كان من غير المرجح أن تبقى ملفاتك مماثلة من الالتزام بالالتزام، فيمكنك إيقاف تشغيل Deltas Binary تماما. بالإضافة إلى ذلك، لأنه لا معنى له ضغط ملفات مضغوطة بالفعل أو مشفرة، مثل .zip، .jpg أو .crypt، يتيح لك GIT إيقاف تشغيل ضغط التخزين الأساسي. لسوء الحظ إنه إعداد شامل أو لا شيء يؤثر على التعليمات البرمجية المصدرية أيضا.

  • قد ترغب في تطبيق أجزاء من Otabs للسماح باستخدام الاستخدام الأسرع. على وجه الخصوص، خطوات البرمجة النصية 2-3 من حذف الملفات الثنائية تماما في an. update قد يعطي هوك GIT مقنعا ولكن ربما خطرة إلى جلب الجيت ("جلب وحذف كل شيء قديم").

  • قد ترغب في تخطي الخطوة 4 من حذف الملفات الثنائية تماما للحفاظ على تاريخ كامل لجميع التغييرات الثنائية على جهاز التحكم عن بعد بتكلفة المستودع المركزي. المستودعات المحلية ستظل تميل بمرور الوقت.

  • في عالم Java، من الممكن الجمع بين هذا الحل مع maven --offline لإنشاء بناء غير متناكر غير متنااصل تخزينها بالكامل في عنصر تحكم الإصدار الخاص بك (إنه أسهل مع Maven أكثر من Madle). في Golang World، من الممكن البناء على هذا الحل لإدارة Gopath بدلا من go get. وبعد في Python World، من الممكن الجمع بين هذا مع Virtualenv لإنتاج بيئة تطوير ذاتية المستوى دون الاعتماد على خوادم Pypi لكل بناء من الصفر.

  • إذا تغيرت الملفات الثنائية في كثير من الأحيان، مثل بناء القطع الأثرية، فقد يكون من الجيد النصي حل حل يخزن 5 إصدارات أحدث من القطع الأثرية في علامات اليتيم monday_bin, tuesday_bin, ..., friday_bin, وأيضا علامة الأيتام لكل إصدار 1.7.8bin 2.0.0bin, ، وما إلى ذلك يمكنك تدوير weekday_bin وحذف الثنائيات القديمة يوميا. وبهذه الطريقة تحصل على أفضل ما في العالمين: يمكنك الاحتفاظ بأكمله تاريخ شفرة المصدر الخاصة بك ولكن فقط ذو صلة تاريخ التبعيات الثنائية الخاصة بك. من السهل جدا الحصول على الملفات الثنائية للحصول على علامة معينة بدون الحصول على شفرة المصدر بأكملها مع جميع سجلاتها: git init && git remote add <name> <url> && git fetch <name> <tag> يجب أن تفعل ذلك من أجلك.

يبدو أن SVN تعامل مع Deltas الثنائية بكفاءة أكثر بكفاءة من GIT.

اضطررت إلى اتخاذ قرار بشأن نظام إصدار للوثائق (ملفات JPEG وملفات PDF وملفات .odt). لقد قمت بالاختبار فقط إضافة ملف JPEG وتدويره 90 درجة أربع مرات (للتحقق من فعالية Deltas Binary). نمت مستودع جيت 400٪. نمت مستودع SVN بنسبة 11٪ فقط.

لذلك يبدو أن SVN أكثر كفاءة بكثير مع الملفات الثنائية.

لذلك خياري هو git for code المصدر و SVN للملفات الثنائية مثل الوثائق.

git clone --filter من GIT 2.19 + الحيوانات المستنسخة الضحلة

قد يصبح هذا الخيار الجديد في النهاية الحل النهائي لمشكلة الملف الثنائي، إذا كان GIT و GYTHUB Devs وجعله سهل الاستخدام كافيا (الذي يمكن القول لا تزال لم تتحقق للنفع علي سبيل المثال).

يسمح بالفعل بجلب الملفات والدلائل التي تريدها فقط عن الخادم، وتم تقديمها مع ملحق بروتوكول عن بعد.

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

هناك حتى بالفعل --filter=blob:limit<size> والتي تسمح بالحد من الحد الأقصى لحجم النقط إلى جلب.

لقد قدمت من مثالا مفصلا عن الطريقة التي تبدو بها الميزة في: كيف استنسخ دليل فرعي فقط من مستودع جيت؟

أنا أبحث عن آراء حول كيفية التعامل مع الملفات الثنائية الكبيرة التي يعتمد عليها شفرة المصدر (تطبيق الويب). ما هي تجاربك / أفكارك فيما يتعلق بهذا؟

أنا شخصيا أجري فشل التزامن مع git مع بعض مضيفاتي السحابية بمجرد حقق بيانات الويب الخاصة بي البيانات الثنائية فوق علامة 3 جيجابايت. وبعد اعتبرت bft repo منظف في ذلك الوقت، ولكن شعرت مثل الاختراق. منذ ذلك الحين بدأت في الاحتفاظ بالملفات خارج نطاق GIT Purview، بدلا من ذلك الأدوات المبنية للأغراض مثل Amazon S3 لإدارة الملفات والنسخة والنسخ الاحتياطي.

هل لدى أي شخص خبرة في مستودعات متعددة الجيت وإدارةها في مشروع واحد؟

نعم. هوغو الموضوعات تمكنت في المقام الأول هذه الطريقة. إنه كودجي قليلا، لكنه ينجز المهمة.


اقتراحي هو اختر الأداة المناسبة لهذا المنصب. وبعد إذا كان ذلك للحصول على شركة وأنت تدير Codeline الخاص بك على Github دفع الأموال واستخدام GIT-LFS. وإلا يمكنك استكشاف المزيد من الخيارات الإبداعية مثل اللامركزية المشفرة تخزين الملفات باستخدام blockchain.

خيارات إضافية للنظر تشمل minio. و s3cmd..

القي نظرة على Camlaceore.. وبعد إنه ليس حقا GIT مقرها، لكنني أجد أنه أكثر ملاءمة لما عليك فعله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top