दिलचस्प पोस्ट
जावास्क्रिप्ट को स्ट्रिंग से नंबर मिलता है ट्विटर बूटस्ट्रैप में स्टाइल को कैसे ओवरराइट करें कैसे json को डेटा स्वरूप में परिवर्तित कर सकता है? ज़िप कोड के बीच दूरी की गणना करें … और उपयोगकर्ता एक पृष्ठभूमि स्क्रिप्ट से सामग्री स्क्रिप्ट तक संदेश भेजना, फिर इंजेक्शन वाली स्क्रिप्ट के लिए स्टेटलेस रैंडम नंबर जनरेटर क्या मौजूद हैं? पता कैसे करें कि अजगर चर एक फ़ंक्शन है? पाठ अंतर एल्गोरिथ्म डीबीसीपी – विभिन्न डेटाबेस के लिए सत्यापन नेविगेशन नियंत्रक के साथ सही तरीके से टैब बार नियंत्रक कैसे लागू करें स्विफ्ट – एन्कोड यूआरएल एक नेटवर्क से XAMPP तक पहुंचने का प्रयास करते समय त्रुटि जावा पोजो वर्ग, जावा बीन, सामान्य वर्ग क्या है? इस कीवर्ड के साथ requestAnimationFrame रेल में 404 में कैसे पुनर्निर्देशित किया जाए?

मेरी जीआईटी भंडार इतनी बड़ी क्यों है?

145 एम = .git / वस्तुओं / पैक /

प्रत्येक लिखे की ओर से पीछे जाने से पहले प्रत्येक कमिट और कमिट के मतभेदों को जोड़ने के लिए मैंने एक स्क्रिप्ट लिखी है। मुझे 12 9 एमबी मिलता है, जो संपीड़न के बिना है और शाखाओं में समान फाइलों के लिए और शाखाओं के बीच सामान्य इतिहास के बिना लेखा के बिना।

गिट उन सभी चीजों को ध्यान में रखता है इसलिए मैं बहुत छोटी भंडार की अपेक्षा करता हूं तो क्यों इतनी बड़ी है?

मेरा होगया:

git fsck --full git gc --prune=today --aggressive git repack 

कितनी फाइल / कमेटी के बारे में जवाब देने के लिए, मेरे पास प्रत्येक में लगभग 40 फाइलें हैं, 287 कमिट्स, का उपयोग करते हुए पाया गया:

 git log --oneline --all|wc -l 

इसके बारे में जानकारी रखने के लिए 10 मेगाबाइट्स नहीं लेना चाहिए।

वेब के समाधान से एकत्रित समाधान "मेरी जीआईटी भंडार इतनी बड़ी क्यों है?"

मैंने हाल ही में गलत रिमोट रिपॉजिटरी को स्थानीय एक ( git remote add ... और git remote update ) में खींच लिया। अवांछित दूरस्थ रेफरी, शाखाओं और टैग को हटाने के बाद भी मेरे भंडार में 1.4GB (!) व्यर्थ स्थान था मैं इसे केवल git clone file:///path/to/repository साथ git clone file:///path/to/repository करके इसे से छुटकारा पा रहा था git clone file:///path/to/repository ध्यान दें कि file:// एक स्थानीय भंडार क्लोनिंग करते समय अंतर का एक विश्व बना देता है – केवल संदर्भित ऑब्जेक्ट की प्रतिलिपि बनाई जाती है, पूर्ण निर्देशिका संरचना नहीं।

संपादित करें: नए रेपो में सभी शाखाओं को पुनः बनाने के लिए इयान का एक लाइनर है:

 d1=#original repo d2=#new repo (must already exist) cd $d1 for b in $(git branch | cut -c 3-) do git checkout $b x=$(git rev-parse HEAD) cd $d2 git checkout -b $b $x cd $d1 done 

कुछ लिपियों का मैं उपयोग करता हूं:

Git-fatfiles

 git rev-list --all --objects | \ sed -n $(git rev-list --objects --all | \ cut -f1 -d' ' | \ git cat-file --batch-check | \ grep blob | \ sort -n -k 3 | \ tail -n40 | \ while read hash type size; do echo -n "-es/$hash/$size/p "; done) | \ sort -n -k1 
 ... 89076 images/screenshots/properties.png 103472 images/screenshots/signals.png 9434202 video/parasite-intro.avi 

यदि आप अधिक लाइन चाहते हैं, तो पड़ोसी उत्तर में पर्ल संस्करण देखें: https://stackoverflow.com/a/45366030/266720

git-eradicate ( video/parasite.avi ):

 git filter-branch -f --index-filter \ 'git rm --force --cached --ignore-unmatch video/parasite-intro.avi' \ -- --all rm -Rf .git/refs/original && \ git reflog expire --expire=now --all && \ git gc --aggressive && \ git prune 

नोट: दूसरी स्क्रिप्ट पूरी तरह से गिट से जानकारी को हटाने के लिए डिज़ाइन की गई है (रेफ्लॉग से सभी जानकारी सहित) सावधानी से प्रयोग करें।

git gc पहले से ही एक git repack करता है, इसलिए जब तक आप इसे कुछ विशेष विकल्प नहीं गुजरते हैं मैन्युअल रूप से repacking में कोई मतलब नहीं है

पहला कदम यह है कि क्या अधिकतर स्थान (जैसा आमतौर पर मामला होता है) आपका ऑब्जेक्ट डेटाबेस है या नहीं।

 git count-objects -v 

यह आपकी रिपॉजिटरी में कितने अनकैक्ट ऑब्जेक्ट्स की रिपोर्ट देनी चाहिए, कितनी जगह लेते हैं, आपके पास कितने पैक की गईं और कितनी जगह लेते हैं

आदर्श रूप से, एक पुनरावृत्ति के बाद, आपके पास बिना पठित वस्तुओं और एक पैक फ़ाइल होती, लेकिन कुछ ऑब्जेक्ट्स के लिए यह सामान्य रूप से सामान्य है कि वर्तमान शाखाएं अभी भी वर्तमान और अनपैक्ड द्वारा संदर्भित नहीं हैं।

यदि आपके पास एक बड़ा पैक है और आप यह जानना चाहते हैं कि क्या स्थान ले रहा है, तो आप उस ऑब्जेक्ट की सूची कर सकते हैं जो पैक को कैसे बनाते हैं और कैसे वे संग्रहीत हैं।

 git verify-pack -v .git/objects/pack/pack-*.idx 

ध्यान दें कि verify-pack एक इंडेक्स फ़ाइल लेता है और पैक फ़ाइल ही नहीं। यह पैक में प्रत्येक ऑब्जेक्ट की रिपोर्ट, इसका सच्चे आकार और इसके पैक किए गए आकार के साथ-साथ यह जानकारी दी गई है कि यह 'deltified' है और यदि डेल्टा श्रृंखला का मूल है

यह देखने के लिए कि क्या आपके रिपॉजिटरी में कोई असामान्य रूप से बड़ी ऑब्जेक्ट हैं, आप चौथे कॉलम के तीसरे नंबर पर (उदाहरण के लिए | sort -k3n ) संख्यात्मक रूप से आउटपुट सॉर्ट कर सकते हैं।

इस आउटपुट से आप git show कमांड का उपयोग करके किसी ऑब्जेक्ट की सामग्रियों को देख सकेंगे, हालांकि यह देखने के लिए संभव नहीं है कि ऑब्जेक्ट का संदर्भ दिया गया है जहां रिपॉजिटरी के कम्यूट इतिहास में। यदि आपको ऐसा करने की आवश्यकता है, तो इस प्रश्न से कुछ प्रयास करें

सिर्फ एफवाईआई, सबसे बड़ी वजह यह है कि आप अवांछित वस्तुओं के आसपास क्यों रह सकते हैं, यह है कि जीआईटी एक रेफरल रखता है।

जब आप गलती से अपनी मास्टर शाखा को हटा देते हैं या किसी अन्य तरीके से आपके रिपॉजिटरी को नुकसान पहुंचाते हैं तो आपके बट को सहेजने के लिए रेफरल है।

इसे ठीक करने का सबसे आसान तरीका यह है कि आपके रेफ्लग को कम करने से पहले (केवल यह सुनिश्चित कर लें कि आप किसी भी प्रकार के रिफॉल में वापस नहीं जाना चाहते हैं) को कम करना है।

 git gc --prune=now --aggressive git repack 

यह git gc --prune=today से अलग है क्योंकि इसमें पूरी तरह से तुरन्त reflog समाप्त हो जाता है

क्या आप सुनिश्चित हैं कि आप .pack फ़ाइलों की गणना कर रहे हैं और नहीं .एक्सएक्स फ़ाइलें? वे .pack फ़ाइलों के समान एक ही निर्देशिका में हैं, लेकिन कोई भी रिपॉज़िटरी डेटा नहीं है (जैसा कि एक्सटेंशन इंगित करता है, वे संबंधित पैक के लिए अनुक्रमित से अधिक कुछ नहीं हैं – वास्तव में, अगर आप सही कमांड जानते हैं, तो आप कर सकते हैं आसानी से उन्हें पैक फ़ाइल से पुन: बनाएँ, और क्लोनिंग करते समय ही git ही करता है, क्योंकि मूल जीआईटी प्रोटोकॉल का उपयोग करके केवल एक पैक फाइल स्थानांतरित होती है)।

एक प्रतिनिधि नमूने के रूप में, मैंने अपने स्थानीय क्लोन को लिनक्स -2.6 रिपॉजिटरी पर देखा:

 $ du -c *.pack 505888 total $ du -c *.idx 34300 total 

जो इंगित करता है कि लगभग 7% का विस्तार सामान्य होना चाहिए।

objects/ बाहर भी फाइलें हैं; मेरे व्यक्तिगत अनुभव में, उनमें से index और gitk.cache सबसे बड़े होते हैं (लिनक्स gitk.cache रिपॉजिटरी के क्लोन में कुल 11 एम)।

यदि आप यह जानना चाहते हैं कि आपके जीआईटी भंडार में कौन सी फाइलें स्थान ले रही हैं, तो चलाएं

git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5

फिर, ब्ब्ब संदर्भ निकालें जो सबसे अधिक स्थान (अंतिम पंक्ति) लेता है, और उस फ़ाइल नाम की जांच करें जो इतना स्थान ले रहा है

git rev-list --objects --all | grep <reference>

यह एक ऐसी फाइल भी हो सकती है जिसे आपने git rm हटा दिया था, लेकिन git इसे याद करता है क्योंकि इसमें अभी भी संदर्भ हैं, जैसे कि टैग, रिमोट और रेफरल

एक बार जब आप जानते हैं कि आप किस फ़ाइल से छुटकारा पा रहे हैं, तो मैं git forget-blob का उपयोग करने की सलाह देता हूं

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

इसका उपयोग करना आसान है, बस करो

git forget-blob file-to-forget

इससे जीआईटी से हर संदर्भ को हटा दिया जाएगा, इतिहास के हर प्रतिबद्धता से ब्लॉ को हटा दें, और स्थान खाली करने के लिए कचरा संग्रहण चलाएं।

वी के जवाब से git-fatfiles स्क्रिप्ट सुंदर है अगर आप अपने सभी blobs के आकार देखना चाहते हैं, लेकिन यह बहुत बेकार है के रूप में धीमा है। मैंने 40-लाइन आउटपुट सीमा को हटा दिया, और यह अपने सभी कंप्यूटर की रैम को खत्म करने के बजाय उपयोग करने की कोशिश की तो मैंने इसे दोहराया है: यह हजारों बार तेज है, सुविधाओं (वैकल्पिक) जोड़ दी है, और कुछ अजीब बग निकाल दिया गया था – पुराने संस्करण गलत मायने रखता है यदि आप किसी फ़ाइल द्वारा उपयोग की गई कुल स्थान को देखने के लिए आउटपुट का योग करते हैं।

 #!/usr/bin/perl use warnings; use strict; use IPC::Open2; use v5.14; # Try to get the "format_bytes" function: my $canFormat = eval { require Number::Bytes::Human; Number::Bytes::Human->import('format_bytes'); 1; }; my $format_bytes; if ($canFormat) { $format_bytes = \&format_bytes; } else { $format_bytes = sub { return shift; }; } # parse arguments: my ($directories, $sum); { my $arg = $ARGV[0] // ""; if ($arg eq "--sum" || $arg eq "-s") { $sum = 1; } elsif ($arg eq "--directories" || $arg eq "-d") { $directories = 1; $sum = 1; } elsif ($arg) { print "Usage: $0 [ --sum, -s | --directories, -d ]\n"; exit 1; } } # the format is [hash, file] my %revList = map { (split(' ', $_))[0 => 1]; } qx(git rev-list --all --objects); my $pid = open2(my $childOut, my $childIn, "git cat-file --batch-check"); # The format is (hash => size) my %hashSizes = map { print $childIn $_ . "\n"; my @blobData = split(' ', <$childOut>); if ($blobData[1] eq 'blob') { # [hash, size] $blobData[0] => $blobData[2]; } else { (); } } keys %revList; close($childIn); waitpid($pid, 0); # Need to filter because some aren't files--there are useless directories in this list. # Format is name => size. my %fileSizes = map { exists($hashSizes{$_}) ? ($revList{$_} => $hashSizes{$_}) : () } keys %revList; my @sortedSizes; if ($sum) { my %fileSizeSums; if ($directories) { while (my ($name, $size) = each %fileSizes) { # strip off the trailing part of the filename: $fileSizeSums{$name =~ s|/[^/]*$||r} += $size; } } else { while (my ($name, $size) = each %fileSizes) { $fileSizeSums{$name} += $size; } } @sortedSizes = map { [$_, $fileSizeSums{$_}] } sort { $fileSizeSums{$a} <=> $fileSizeSums{$b} } keys %fileSizeSums; } else { # Print the space taken by each file/blob, sorted by size @sortedSizes = map { [$_, $fileSizes{$_}] } sort { $fileSizes{$a} <=> $fileSizes{$b} } keys %fileSizes; } for my $fileSize (@sortedSizes) { printf "%s\t%s\n", $format_bytes->($fileSize->[1]), $fileSize->[0]; } 

इस git-fatfiles.pl नाम दें और इसे चलाएं। किसी फ़ाइल के सभी संशोधन के द्वारा उपयोग की गई डिस्क स्थान को देखने के लिए, --sum विकल्प का उपयोग करें एक ही बात देखने के लिए, लेकिन प्रत्येक निर्देशिका में फ़ाइलों के लिए, --directories विकल्प का उपयोग करें। यदि आप संख्या :: बाइट :: मानव cpan मॉड्यूल ("cpan संख्या: बाइट :: मानव" चलाएँ) स्थापित करते हैं, तो आकार स्वरूपित हो जाएगा: "21M / path / to / file.mp4"।

गिट में संग्रहित अन्य जीआईटी ऑब्जेक्ट में पेड़ों, .git और टैग शामिल हैं। प्रतिबद्धता और टैग छोटे होते हैं, लेकिन पेड़ों को बड़ा हो सकता है, खासकर अगर आपके पास अपनी रत्जिटरी में बड़ी संख्या में छोटी फाइलें हो सकती हैं आपके पास कितनी फाइलें हैं और आपके पास कितनी कमाई है?

क्या आप git repack का उपयोग करने की कोशिश करते हैं?

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

सभी गैर-वांछित सामानों से छुटकारा पाने का सबसे अच्छा तरीका है git-filter & git gc को चलाने के लिए और फिर मास्टर को एक नया नंगे रेपो में धक्का देना। नए बेअर रेपो में साफ पेड़ लगा होगा।

यह तब हो सकता है जब आपने फ़ाइलों का एक बड़ा हिस्सा गलती से जोड़ा और उनका मंचन किया, जरूरी नहीं कि उन्हें प्रतिबद्ध यह rails ऐप में हो सकता है जब आप bundle install --deployment और फिर गलती से git add . तो आप देख सकते हैं कि सभी फाइलें vendor/bundle जरिये जोड़ी गईं थीं, लेकिन उन्हें पहले से ही जीआईटी के इतिहास में मिला है, इसलिए वीआई के जवाब और video/parasite-intro.avi vendor/bundle बदलना होगा और फिर वह दूसरी कमांड प्रदान करेगा जिसे वह प्रदान करता है।

आप git count-objects -v साथ अंतर देख सकते हैं जो स्क्रिप्ट लागू करने से पहले मेरे मामले में एक आकार-पैक था: 52K का और आवेदन करने के बाद यह 3.8K था।