macOS-এ একটি রিপোজিটরির রিচেবল গিট হিস্ট্রিতে সংরক্ষিত সবচেয়ে বড় ফাইলগুলি খুঁজতে, টার্মিনাল খুলুন, রিপোজিটরিতে যান এবং গিটের অবজেক্ট তালিকাকে git cat-file এবং sort-এর মাধ্যমে পাইপ করুন। এটি প্রতিটি ব্লবের আনকম্প্রেসড আকার বাইটে এবং একটি পাথের ইঙ্গিত প্রদর্শন করে। এটি এমন ফাইলগুলি প্রকাশ করতে পারে যা মুছে ফেলা হয়েছে বা প্রতিস্থাপন করা হয়েছে কিন্তু এখনও শাখা বা ট্যাগ থেকে অ্যাক্সেসযোগ্য কমিটগুলিতে রয়ে গেছে।

টার্মিনাল থেকে একটি হিস্ট্রি স্ক্যান চালান

টার্মিনালে, রিপোজিটরিতে প্রবেশ করতে cd ব্যবহার করুন। ফোল্ডারের পাথে স্পেস থাকলে তা কোটেশনের মধ্যে রাখুন। তারপর চালান:

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

ফলাফলটি সবচেয়ে বড় থেকে ক্রমানুসারে সাজানো হয়। প্রতিটি সারিতে অবজেক্টের ধরন, বাইটের সংখ্যা, অবজেক্ট আইডি এবং গিট সরবরাহ করলে একটি পাথের ইঙ্গিত দেখা যায়। git rev-list --objects --all লোকাল শাখা এবং ট্যাগের মতো রেফ (refs) থেকে রিচেবল কমিট দ্বারা নির্দেশিত অবজেক্টগুলি পরিভ্রমণ করে; git cat-file --batch-check প্রতিটি অবজেক্টের ধরন এবং আকার রিপোর্ট করে। এই পাইপলাইনটি ব্লবগুলির জন্য ফিল্টার করে, যা ফাইলের সামগ্রী ধারণকারী অবজেক্ট। গিটের rev-list ডকুমেন্টেশন অবজেক্ট ট্রাভার্সাল এবং নামগুলি বর্ণনা করে, এবং cat-file ব্যাচ আকার এবং ধরনের আউটপুট নথিভুক্ত করে।

sort -k2,2nr হোয়াইটস্পেস দ্বারা বিভক্ত দ্বিতীয় ফিল্ড অর্থাৎ বাইট আকার অনুযায়ী সাংখ্যিকভাবে বিপরীত ক্রমে সাজাতে macOS-এর বিল্ট-ইন sort ব্যবহার করে। head -20 প্রদর্শনকে ২০টি সারিতে সীমাবদ্ধ করে; আরও দেখতে সংখ্যাটি পরিবর্তন করুন বা শেষ লাইনটি সরিয়ে দিন। কমান্ডটি শুধুমাত্র রিপোজিটরির ডেটা পড়ে। এটি কমিট বা ফাইল সংশোধন করে না।

ফলাফলগুলি সাবধানে ব্যাখ্যা করুন

একটি সারি একটি ব্লব অবজেক্ট সনাক্ত করে, যা ওয়ার্কিং ট্রিতে বর্তমানে উপস্থিত কোনও ফাইল নাও হতে পারে। একটি বড় অবজেক্ট ফাইলের একটি পুরানো সংস্করণ থেকেও আসতে পারে, এবং একটি পাথের ইঙ্গিত কোনও সম্পূর্ণ ঐতিহাসিক পাথ ইনডেক্স নয়: গিট নথিতে উল্লেখ রয়েছে যে --objects-এর সাথে নামগুলি কেবল ইঙ্গিত মাত্র, নতুন লাইনের জন্য পরিবর্তিত হতে পারে, এবং যখন একটি অবজেক্টের একাধিক নাম থাকে তখন কেবল একটি প্রদর্শিত হতে পারে। তালিকাভুক্ত পাথটিকে একটি সূত্র হিসেবে বিবেচনা করুন, তারপর সামগ্রীটি কখন এবং কোথায় উপস্থিত হয়েছিল তা নিশ্চিত করতে প্রাসঙ্গিক কমিটগুলি পরিদর্শন করুন। গিটের 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 count-objects -vH চালান; এর size-pack ফিল্ড প্যাক করা ডেটার আকার রিপোর্ট করে এবং এর অন্যান্য ফিল্ডগুলি লুজ অবজেক্ট এবং সম্পর্কিত স্টোরেজের সারসংক্ষেপ প্রদান করে। গিটের count-objects ম্যানুয়াল এই পরিসংখ্যানগুলি নথিভুক্ত করে। প্যাক করা অবজেক্টের আকার এবং ডেল্টা বিশদ পরিদর্শন করতে, git verify-pack -v প্রতিটি প্যাক করা অবজেক্টের আকার এবং প্যাকফাইলে তার আকার তালিকাভুক্ত করে, তবে এর জন্য প্রাসঙ্গিক .idx ফাইলের প্রয়োজন হয়। verify-pack ম্যানুয়াল সেই আউটপুটকে সংজ্ঞায়িত করে।

আপনি যদি একটি বড় ঐতিহাসিক ফাইল খুঁজে পান

প্রথমে সিদ্ধান্ত নিন যে আপনার কাজটি বর্তমান চেকআউটটি বোঝা নাকি রিপোজিটরির হিস্ট্রি কমানো। শুধুমাত্র বর্তমান সংস্করণের জন্য, ফাইন্ডারে ফাইলগুলি পরিদর্শন করুন বা টার্মিনালে একটি ফাইল-সাইজ তালিকা ব্যবহার করুন; হিস্ট্রি স্ক্যানটি রিচেবল গিট অবজেক্টগুলি অনুসন্ধান করে একটি ভিন্ন প্রশ্নের উত্তর দেয়।

যদি একটি বড় ফাইল প্রতিটি রিভিশন থেকেই অপসারণ করতে হয়, তবে কেবল একটি নতুন কমিটে এটি মুছে ফেললে হিস্ট্রি থেকে পুরানো কপিগুলি মুছে যায় না। হিস্ট্রি পুনরায় লেখার ফলে কমিট আইডি পরিবর্তন হয় এবং রিপোজিটরি ব্যবহারকারী অন্যান্য ব্যক্তিদের প্রভাবিত করে, তাই এটি করার আগে সমন্বয় করুন এবং একটি ব্যাকআপ সংরক্ষণ করুন। git-filter-repo প্রকল্পটি একটি রিড-ওনলি বিশ্লেষণ মোড সরবরাহ করে, git filter-repo --analyze, যা ফিল্টার করার সিদ্ধান্ত নিতে সহায়তা করার জন্য রিপোর্ট তৈরি করে; এটি বিশ্লেষণ মোডে রিরাইট সম্পাদন করে না। প্রকল্পটির ডকুমেন্টেশন বিশ্লেষণ বিকল্পটি বর্ণনা করে এবং সতর্ক করে যে ফিল্টারিং হিস্ট্রি পুনরায় লিখে ফেলে।

একটি লোকাল রিপোজিটরির হিস্ট্রির পেছনে থাকা সবচেয়ে বড় ফাইল বিষয়বস্তু খুঁজে বের করার লক্ষ্য হলে প্রথম পাইপলাইনটি হলো বাস্তবসম্মত শুরুর বিন্দু। যখন আনরিচেবল অবশিষ্টাংশগুলি গুরুত্বপূর্ণ হয় তখন অল-অবজেক্ট স্ক্যান ব্যবহার করুন, এবং কোনও নির্দিষ্ট ব্লবকে ডিস্ক ব্যবহারের জন্য দায়ী করার আগে প্যাক স্টোরেজের সাথে গিট অবজেক্টের আকার তুলনা করুন।

সূত্র