یه کامیت گیت چقدر جا میگیره؟
خلاصهٔ کاملتر
نویسنده سؤال سادهٔ «یه کامیت گیت چقدر فضا میگیره؟» رو برداشته و جواب کوتاهش اینه: بستگی داره. گیت آبجکتها رو بهصورت دادهٔ فشردهشده با zlib ذخیره میکنه، پس اندازهٔ نهایی به میزان تکرار داخل فایلها برمیگرده. عامل دوم هم packfileهاست؛ گیت بعداً آبجکتهای loose رو تو پکفایل جمع میکنه و افزونگی بین آبجکتها رو هم از بین میبره. همهٔ آزمایشهای این نوشته عمداً فقط با آبجکتهای loose و بدون ساخته شدن packfile انجام شده.
اندازهگیریها با du -sb .git قبل و بعد از هر کامیت گرفته شده. یه ریپوی تازه بعد از git init حدود ۶۴ کیلوبایته. کامیت کردن ۲۵۰ فایل ریز تو ۵ پوشه ۴۷ کیلوبایت اضافه میکنه، و جالبتر اینکه فقط ۳ بایت تغییر تو یکی از همون فایلها ۱۷ کیلوبایت وزن میذاره. همون ۳ بایت تغییر تو ریپویی که فقط یه فایل داره، ۸.۷ کیلوبایت میشه — یعنی سربار کامیتهای ریز بیشتر به اندازهٔ درخت فایلها ربط داره تا به حجم خودِ تغییر.
برای اینکه بفهمه این وزن از کجا میاد، نویسنده سراغ آبجکتهای تازهساختهشده رفته و — به کمک مستندات جدید مدل دادهٔ گیت از جولیا اونز — با git show روی هش هر آبجکت محتواش رو دیده؛ چیزی که به گفتهٔ خودش برای هر نوع آبجکتی کار میکنه، نه فقط کامیت.
معلوم شده یه کامیت تکفایلی چهار آبجکت جدید میسازه: خودِ کامیت، محتوای فایل تغییرکرده، و دو تا tree، یکی برای پوشهٔ همون فایل و یکی برای ریشهٔ ریپو. چون هر آبجکت loose تو فایل جدا میشینه، هر کدوم حداقل یه بلاک حدوداً ۴ کیلوبایتی میگیره.
روی فایلهای بزرگ ماجرا برعکس میشه. یه فایل باینری ۵۸۰ کیلوبایتی فقط حدود ۳۰۰ کیلوبایت به .git اضافه کرده، و یه فایل سورس متنی ۱۶.۴ مگابایتی فقط ۱.۶ مگابایت — یعنی حدود یکدهم، که خود نویسنده هم میگه انتظارشو نداشته. جمعبندیش اینه که برای کامیتهای بزرگ با تعداد فایل کم، دادهٔ ذخیرهشده چیزی بین ۵۰ تا ۱۰ درصد حجم فشردهنشدهست؛ یعنی گیت واقعاً بهینهست و اون سربار چندکیلوبایتی فقط سر کامیتهای خیلی ریز خودشو نشون میده.
نکات کلیدی:
- گیت آبجکتها رو با zlib فشرده میکنه، پس اندازه به تکرارپذیریِ محتوا بستگی داره
- ریپوی خالی حدود ۶۴ کیلوبایته و ۳ بایت تغییر میتونه ۱۷ کیلوبایت خرج برداره
- هر کامیت تکفایلی چهار آبجکت میسازه: کامیت، محتوای فایل و دو tree
- فایل باینری ۵۸۰ کیلوبایتی حدود ۳۰۰ کیلوبایت و سورس ۱۶.۴ مگابایتی فقط ۱.۶ مگابایت شده
- packfile بعداً افزونگی بین آبجکتها رو هم حذف میکنه و باز هم جا صرفهجویی میشه




