আমি সর্বাধিক জনপ্রিয় উত্তরটি ব্যবহার করতে অক্ষম ছিলাম কারণ --batch-checkকমান্ড-লাইনটি গিট 1.8.3 এ (যা আমাকে ব্যবহার করতে হবে) কোনও যুক্তি স্বীকার করে না। পরবর্তী পদক্ষেপগুলি সেন্টস 6.5 এ ব্যাশ 4.1.2 দিয়ে চেষ্টা করা হয়েছে
মূল ধারণা
গিটে, ব্লব শব্দটি কোনও ফাইলের বিষয়বস্তু বোঝায়। মনে রাখবেন যে প্রতিশ্রুতিবদ্ধ ফাইল বা পথের নামের বিষয়বস্তু পরিবর্তন করতে পারে। সুতরাং, একই ফাইলটি কমিটের উপর নির্ভর করে একটি ভিন্ন ব্লবকে উল্লেখ করতে পারে। একটি নির্দিষ্ট ফাইল ডিরেক্টরিতে হায়ারার্কির মধ্যে একটি কমিটের মধ্যে সবচেয়ে বড় হতে পারে, অন্যটিতে না হলেও। অতএব, বড় ফাইলগুলির পরিবর্তে বড় কমিটগুলি সন্ধানের প্রশ্নটি বিষয়গুলিকে সঠিক দৃষ্টিকোণে রাখে।
অধৈর্য জন্য
আকারের অবতরণ ক্রমে ব্লবগুলির তালিকা মুদ্রণের কমান্ডটি হ'ল:
git cat-file --batch-check < <(git rev-list --all --objects | \
awk '{print $1}') | grep blob | sort -n -r -k 3
নমুনা আউটপুট:
3a51a45e12d4aedcad53d3a0d4cf42079c62958e blob 305971200
7c357f2c2a7b33f939f9b7125b155adbd7890be2 blob 289163620
এই জাতীয় ব্লবগুলি অপসারণ করতে, অন্যান্য উত্তরে উল্লিখিত বিএফজি রেপো ক্লিনারটি ব্যবহার করুন । একটি ফাইল দেওয়া হয়েছে blobs.txtযাতে সবেমাত্র ব্লব হ্যাশ রয়েছে, উদাহরণস্বরূপ:
3a51a45e12d4aedcad53d3a0d4cf42079c62958e
7c357f2c2a7b33f939f9b7125b155adbd7890be2
না:
java -jar bfg.jar -bi blobs.txt <repo_dir>
প্রশ্নটি কমিটগুলি সন্ধানের বিষয়ে যা ব্লবগুলি অনুসন্ধানের চেয়ে বেশি কাজ। জানতে, পড়ুন দয়া করে।
আরও কাজ
একটি প্রতিশ্রুতিবদ্ধ হ্যাশ দেওয়া হয়েছে, একটি কমান্ড যা ব্লব সহ এর সাথে যুক্ত সমস্ত বস্তুর হ্যাশ মুদ্রণ করে:
git ls-tree -r --full-tree <commit_hash>
সুতরাং, যদি আমাদের কাছে রেপোতে সমস্ত কমিটের জন্য এই জাতীয় আউটপুট উপলব্ধ থাকে, তবে একটি ব্লব হ্যাশ দেওয়া হয়েছে, কমিটের গুচ্ছটি হ'ল ফলাফলগুলির সাথে মেলে। এই ধারণাটি নিম্নলিখিত স্ক্রিপ্টে এনকোড করা হয়েছে:
#!/bin/bash
DB_DIR='trees-db'
find_commit() {
cd ${DB_DIR}
for f in *; do
if grep -q $1 ${f}; then
echo ${f}
fi
done
cd - > /dev/null
}
create_db() {
local tfile='/tmp/commits.txt'
mkdir -p ${DB_DIR} && cd ${DB_DIR}
git rev-list --all > ${tfile}
while read commit_hash; do
if [[ ! -e ${commit_hash} ]]; then
git ls-tree -r --full-tree ${commit_hash} > ${commit_hash}
fi
done < ${tfile}
cd - > /dev/null
rm -f ${tfile}
}
create_db
while read id; do
find_commit ${id};
done
যদি বিষয়বস্তু নামের একটি ফাইলে সংরক্ষণ করা হয় find-commits.shতবে একটি সাধারণ আহবানটি নীচে থাকবে:
cat blobs.txt | find-commits.sh
আগের হিসাবে, ফাইলটি blobs.txtব্লব হ্যাশগুলির তালিকা করে, প্রতি লাইনে একটি করে। create_db()ফাংশন সমস্ত ক্যাশে বর্তমান ডিরেক্টরির মধ্যে একটি উপ-ডিরেক্টরির মধ্যে তালিকা কমিট পরিমাণ সঞ্চয় হয়।
ওএস দ্বারা 24 ভার্চুয়াল কোর হিসাবে উপস্থাপিত দুটি ইন্টেল (আর) জিয়ন (আর) সিপিইউ E5-2620 2.00GHz প্রসেসর সহ একটি সিস্টেমে আমার পরীক্ষা-নিরীক্ষার কিছু পরিসংখ্যান:
- রেপোতে কমিটের সংখ্যা = প্রায় ১১,০০০
- ফাইল তৈরির গতি = 126 ফাইল / গুলি। স্ক্রিপ্ট প্রতি কমিট প্রতি একক ফাইল তৈরি করে। এটি তখনই ঘটে যখন প্রথমবারের মতো ক্যাশে তৈরি করা হবে।
- ক্যাশে সৃষ্টি ওভারহেড = 87 এস।
- গড় অনুসন্ধানের গতি = 522 কমিট / সেকেন্ড ক্যাশে অপ্টিমাইজেশনের ফলে চলমান সময় 80% হ্রাস পেয়েছে।
নোট করুন যে স্ক্রিপ্টটি একক থ্রেডযুক্ত। সুতরাং, যে কোনও সময়ে কেবল একটি কোর ব্যবহৃত হবে would