मैं सबसे लोकप्रिय उत्तर का उपयोग करने में असमर्थ था क्योंकि --batch-check
कमांड लाइन स्विच Git 1.8.3 (जिसका मुझे उपयोग करना है) किसी भी तर्क को स्वीकार नहीं करता है। बास 4.1.2 के साथ सेंटोस 6.5 पर आगामी कदमों की कोशिश की गई है
प्रमुख धारणाएँ
गिट में, शब्द बूँद एक फ़ाइल की सामग्री का अर्थ है। ध्यान दें कि एक कमेटी फाइल या पाथनाम की सामग्री को बदल सकती है। इस प्रकार, एक ही फाइल कमिट के आधार पर एक अलग ब्लॉब को संदर्भित कर सकती है। एक निश्चित फ़ाइल एक आदेश में निर्देशिका पदानुक्रम में सबसे बड़ी हो सकती है, जबकि दूसरे में नहीं। इसलिए, बड़ी फ़ाइलों के बजाय बड़े कमिट खोजने का प्रश्न, मामलों को सही परिप्रेक्ष्य में रखता है।
अधीर के लिए
आकार के अवरोही क्रम में बूँद की सूची को मुद्रित करने के लिए आदेश है:
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
इस तरह के ब्लब्स को हटाने के लिए, BFG रेपो क्लीनर का उपयोग करें , जैसा कि अन्य उत्तरों में बताया गया है। 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()
समारोह सभी की एक कैश वर्तमान निर्देशिका में एक उप निर्देशिका में लिस्टिंग के लिए प्रतिबद्ध बचाता है।
दो Intel (R) Xeon (R) CPU E5-2620 2.00GHz प्रोसेसर के साथ सिस्टम पर मेरे प्रयोग के कुछ आँकड़े OS द्वारा 24 वर्चुअल कोर के रूप में प्रस्तुत किए गए हैं:
- रेपो में कुल संख्या लगभग 11,000 है
- फ़ाइल निर्माण की गति = 126 फाइलें / एस। स्क्रिप्ट प्रति एक एकल फ़ाइल बनाता है। यह केवल तब होता है जब कैश पहली बार बनाया जा रहा हो।
- कैश निर्माण ओवरहेड = 87 एस।
- औसत खोज गति = 522 कमिट / एस। कैश ऑप्टिमाइज़ेशन से रनिंग टाइम में 80% की कमी आई।
ध्यान दें कि स्क्रिप्ट सिंगल थ्रेडेड है। इसलिए, किसी भी एक समय में केवल एक कोर का उपयोग किया जाएगा।