macOS पर किसी रिपॉजिटरी के रीचेबल Git इतिहास में संग्रहीत सबसे बड़ी फ़ाइलों को खोजने के लिए, Terminal खोलें, रिपॉजिटरी में जाएँ, और Git की ऑब्जेक्ट सूची को git cat-file और sort के ज़रिए पाइप करें। यह प्रत्येक ब्लॉब (blob) का अनकंप्रेस्ड आकार बाइट्स में और एक पाथ संकेत रिपोर्ट करता है। यह उन फ़ाइलों को सामने ला सकता है जिन्हें हटा दिया गया था या बदल दिया गया था, लेकिन वे अभी भी शाखाओं या टैग्स से रीचेबल कमिट्स में मौजूद हैं।

Terminal से इतिहास स्कैन चलाएँ

Terminal में, रिपॉजिटरी में जाने के लिए cd का उपयोग करें। यदि फ़ोल्डर पाथ में स्पेस हैं, तो उसे कोट्स में रखें। फिर चलाएँ:

git rev-list --objects --all |
  git cat-file --batch-check='%(objecttype) %(objectsize) %(objectname) %(rest)' |
  awk '$1 == "blob"' |
  sort -k2,2nr |
  head -20

आउटपुट सबसे बड़े से शुरू होकर सॉर्ट किया जाता है। प्रत्येक पंक्ति ऑब्जेक्ट प्रकार, बाइट संख्या, ऑब्जेक्ट आईडी और, जब Git प्रदान करता है, तो एक पाथ संकेत दिखाती है। git rev-list --objects --all उन ऑब्जेक्ट्स का विवरण एकत्र करता है जो रेफ़्स (refs) जैसे कि स्थानीय शाखाओं और टैग्स से रीचेबल कमिट्स द्वारा संदर्भित हैं; git cat-file --batch-check प्रत्येक ऑब्जेक्ट के प्रकार और आकार की रिपोर्ट करता है। यह पाइपलाइन ब्लॉब्स के लिए फ़िल्टर करती है, जो फ़ाइल की सामग्री रखने वाले ऑब्जेक्ट्स हैं। Git का rev-list दस्तावेज़ीकरण ऑब्जेक्ट ट्रैवर्सल और नामों का वर्णन करता है, और cat-file बैच आकार और प्रकार के आउटपुट का दस्तावेजीकरण करता है।

sort -k2,2nr व्हाइटस्पेस द्वारा अलग किए गए दूसरे फ़ील्ड यानी बाइट आकार के आधार पर उल्टे क्रम में संख्यात्मक रूप से सॉर्ट करने के लिए macOS के इन-बिल्ट sort का उपयोग करता है। head -20 डिस्प्ले को 20 पंक्तियों तक सीमित करता है; अधिक देखने के लिए संख्या बदलें या उस अंतिम पंक्ति को हटा दें। यह कमांड केवल रिपॉजिटरी डेटा को पढ़ता है। यह कमिट्स या फ़ाइलों को संशोधित नहीं करता है।

परिणामों की सावधानीपूर्वक व्याख्या करें

एक पंक्ति किसी ब्लॉब ऑब्जेक्ट की पहचान करती है, ज़रूरी नहीं कि वह वर्किंग ट्री में वर्तमान में मौजूद कोई फ़ाइल हो। एक बड़ा ऑब्जेक्ट किसी फ़ाइल के पुराने संस्करण से हो सकता है, और पाथ संकेत कोई संपूर्ण ऐतिहासिक पाथ इंडेक्स नहीं होता है: Git दस्तावेज़ों में बताया गया है कि --objects के साथ नाम केवल संकेत होते हैं, न्यूलाइन्स के लिए बदले जा सकते हैं, और जब किसी ऑब्जेक्ट के कई नाम होते हैं तो केवल एक ही दिखाया जा सकता है। सूचीबद्ध पाथ को एक सुराग के रूप में लें, फिर यह पुष्टि करने के लिए संबंधित कमिट्स का निरीक्षण करें कि सामग्री कब और कहाँ दिखाई दी थी। Git के rev-list ऑब्जेक्ट-नाम संबंधी नोट्स इन सीमाओं की व्याख्या करते हैं।

यह स्कैन --all द्वारा खोजे गए रेफ़्स से रीचेबल ऑब्जेक्ट्स को कवर करता है, न कि ऐसे हर ऑब्जेक्ट को जो भौतिक रूप से ऑब्जेक्ट डेटाबेस में रह सकता है। अनरीचेबल ऑब्जेक्ट्स सहित स्थानीय ऑब्जेक्ट स्टोरेज की जाँच करने के लिए, चलाएँ:

git cat-file --batch-all-objects \
  --batch-check='%(objecttype) %(objectsize) %(objectname)' |
  awk '$1 == "blob"' |
  sort -k2,2nr |
  head -20

--batch-all-objects रिपॉजिटरी और वैकल्पिक ऑब्जेक्ट स्टोर्स के सभी ऑब्जेक्ट्स पर जाता है, जिसमें वे ऑब्जेक्ट्स भी शामिल हैं जो रेफ़्स से रीचेबल नहीं हैं। यह दूसरा कमांड फ़ाइल पाथ को छोड़ देता है, इसलिए आगे की जाँच करने के लिए ऑब्जेक्ट आईडी का उपयोग करें। cat-file दस्तावेज़ीकरण व्यापक ऑब्जेक्ट कवरेज और इस बात दोनों को नोट करता है कि प्रत्येक ऑब्जेक्ट को केवल एक बार दिखाया जाता है, भले ही उसे कई बार संग्रहीत किया गया हो।

ब्लॉब का आकार डिस्क स्पेस के समान नहीं है

रिपोर्ट किया गया objectsize किसी Git ऑब्जेक्ट का अनकंप्रेस्ड आकार होता है। Git ऑब्जेक्ट्स को कंप्रेस कर सकता है या उन्हें पैकफ़ाइलों के अंदर डेल्टास के रूप में संग्रहीत कर सकता है, इसलिए एक बड़ा ब्लॉब अनिवार्य रूप से उतनी ही मात्रा में डिस्क स्पेस की खपत नहीं कर रहा होता है। स्टोरेज उपयोग के अवलोकन के लिए, git count-objects -vH चलाएँ; इसका size-pack फ़ील्ड पैक्ड डेटा आकार की रिपोर्ट करता है और इसके अन्य फ़ील्ड लूज़ ऑब्जेक्ट्स और संबंधित स्टोरेज को सारांशित करते हैं। Git का count-objects मैनुअल इन आँकड़ों का दस्तावेजीकरण करता है। पैक्ड-ऑब्जेक्ट आकारों और डेल्टा विवरणों का निरीक्षण करने के लिए, git verify-pack -v प्रत्येक पैक्ड ऑब्जेक्ट के आकार और पैकफ़ाइल में उसके आकार को सूचीबद्ध करता है, लेकिन इसके लिए संबंधित .idx फ़ाइल की आवश्यकता होती है। verify-pack मैनुअल उस आउटपुट को परिभाषित करता है।

यदि आपको कोई बड़ी ऐतिहासिक फ़ाइल मिलती है

पहले यह तय करें कि आपका काम वर्तमान चेकआउट को समझना है या रिपॉजिटरी इतिहास को छोटा करना है। केवल वर्तमान संस्करण के लिए, Finder में फ़ाइलों का निरीक्षण करें या Terminal में फ़ाइल-साइज़ लिस्टिंग का उपयोग करें; इतिहास स्कैन रीचेबल Git ऑब्जेक्ट्स को खोजकर एक अलग प्रश्न का उत्तर देता है।

यदि किसी बड़ी फ़ाइल को हर रिविज़न से हटाना है, तो उसे केवल एक नए कमिट में हटाने से इतिहास से उसकी पुरानी प्रतियाँ नहीं मिटती हैं। इतिहास को फिर से लिखने (history rewriting) से कमिट आईडी बदल जाते हैं और रिपॉजिटरी का उपयोग करने वाले अन्य लोग प्रभावित होते हैं, इसलिए ऐसा करने से पहले तालमेल बैठाएँ और एक बैकअप सुरक्षित रखें। git-filter-repo प्रोजेक्ट एक रीड-ओनली विश्लेषण मोड, git filter-repo --analyze प्रदान करता है, जो यह तय करने में मदद के लिए रिपोर्ट तैयार करता है कि किसे फ़िल्टर करना है; यह विश्लेषण मोड में दोबारा लिखने (rewrite) का काम नहीं करता है। प्रोजेक्ट का दस्तावेज़ीकरण विश्लेषण विकल्प का वर्णन करता है और चेतावनी देता है कि फ़िल्टरिंग इतिहास को दोबारा लिखती है।

जब लक्ष्य किसी स्थानीय रिपॉजिटरी के इतिहास में मौजूद सबसे बड़ी फ़ाइल सामग्री को खोजना हो, तो पहली पाइपलाइन व्यावहारिक प्रारंभिक बिंदु है। जब अनरीचेबल बची हुई चीज़ें मायने रखती हों तो ऑल-ऑब्जेक्ट स्कैन का उपयोग करें, और किसी विशेष ब्लॉब के लिए डिस्क उपयोग का श्रेय देने से पहले Git ऑब्जेक्ट के आकारों की तुलना पैक स्टोरेज से करें।

स्रोत