2010-02-01 19 views
14

मैं एक एसवीएन भंडार के साथ काम कर रहा हूं जो कि 3 साल से अधिक पुराना है, इसमें 6,100 से अधिक काम शामिल हैं और आकार में 1.5 जीबी से अधिक है। मैं एसवीएन रिपोजिटरी के आकार को कम करना चाहता हूं (मैं एक पूर्ण एसवीएन निर्यात के आकार के बारे में बात नहीं कर रहा हूं - मेरा मतलब है कि यह पूर्ण भंडार है क्योंकि यह सर्वर पर मौजूद होगा) इसे नए सर्वर पर ले जाने से पहले।एक एसवीएन भंडार के अंदर बड़ी बाइनरी प्रतिबद्धताओं को कैसे पहचानें और संभावित रूप से हटाएं?

वर्तमान भंडार हमारे सॉफ्टवेयर प्रोजेक्ट के लिए स्रोत कोड है, परंतु यह भी इस तरह के रूप में कोई महत्व की अपेक्षाकृत बड़ी द्विआधारी फ़ाइलें हैं:

  • 3 पार्टी उपकरण के एक नंबर के लिए पूर्ण संस्थापक।
  • .jpg & .png फ़ाइलें (जो एक ही फ़ोल्डर में रहते हैं PSDs के unmodified निर्यात हैं)।
  • बिन और ओब्जे फ़ोल्डर्स (जो तब अगली प्रतिबद्धता 'svn अनदेखा' होते हैं)।
  • Resharper निर्देशिकाएं।

इन बड़ी फ़ाइलों में से एक को 'एसवीएन हटा दिया गया' कहा गया है, जिससे वे सबसे बड़े अपराधियों की पहचान करने की और समस्या बना रहे हैं।

  • एक नया SVN भंडार है कि सॉफ्टवेयर प्रोजेक्ट के लिए केवल कोड शामिल बनाएँ - यह वास्तव में महत्वपूर्ण जिसकी नकल की फ़ाइलों वर्ष रिपोजिटरी से उनके SVN इतिहास को बनाए रखने है:

    मैं या तो करना चाहते हैं ।

  • मौजूदा भंडार से बड़ी बाइनरी प्रतिबद्धताओं और फ़ाइलों को हटा दें।

इनमें से कोई भी संभव है?

+1

दिन है जब आप यह कर अफसोस आ जाएगा। लेकिन अगर आप आगे बढ़ते हैं तो दूसरी तरफ "svnadmin डंप" के बारे में सही है। –

+2

मुझे इस पर अफसोस क्यों होगा (ईमानदार सवाल - चुनौती के बजाए!)? मैं बस एसवीएन के अंदर सामग्री से छुटकारा पाने की कोशिश कर रहा हूं जिसे या तो कहीं और संग्रहीत किया जा सकता है (जो मैं करूँगा) या इसे बिल्कुल भी स्टोर करने की आवश्यकता नहीं है। जहां तक ​​मैं इसे देखता हूं अब मुझे केवल अफसोस होगा यदि svnadmin डंप और svndumpfilter रिपोजिटरी इतिहास को दूषित करता है और इसके कई पहलुओं के बाद इसकी पहचान की जाती है। क्या आपका मतलब है कि ऐतिहासिक भ्रष्टाचार की संभावना है? – InvertedAcceleration

उत्तर

4

डंप फ़ाइल को संसाधित करने के लिए आपको अपने वर्तमान भंडार की डंप फ़ाइल और svndumpfilter प्राप्त करने के लिए svnadmin dump का उपयोग करना होगा। जब तक आप सावधान रहें तब तक आप डंपफाइल को मैन्युअल रूप से संशोधित भी कर सकते हैं।

शायद यह एक त्वरित और आसान काम नहीं होने वाला है, लेकिन यह किया जा सकता है। मैंने कुछ ऐसा ही किया है, केवल एक बहुत ही छोटे भंडार के लिए। मेरे पास लगभग 150 संशोधन के साथ रेपो था जिसमें लगभग 600 एमबी थी।

अपने वर्तमान भंडार से डंप बनाएं, आवश्यक परिवर्तन करें और संशोधित डंपफाइल को एक नए भंडार में लोड करने का प्रयास करें। फिर यह सुनिश्चित करने के लिए नई रिपॉजिटरी जांचें कि सब कुछ अभी भी समझ में आता है (इतिहास अभी भी सही है, पथों में कोई अजीब बदलाव नहीं है ...)।

0

क्या यह अतिरिक्त कदम के साथ ही एक अलग समस्या नहीं है? अर्थात। आपको उन फ़ाइलों को ढूंढने की आवश्यकता है जिन्हें आप बड़े और द्विआधारी मानते हैं, और फिर जांचें कि क्या उन्हें वास्तव में एसवीएन द्वारा प्रबंधित किया गया है या स्थानीय रूप से बनाया गया है (या समांतर परिसंपत्ति प्रणाली से आयात किया गया है, यदि यह पहले से मौजूद है)।

तो, बस फाइलें पाएं, फिर svn info पर यह पता लगाने के लिए कि वे भंडार का हिस्सा हैं या नहीं।

+0

एसवीएन रिपोजिटरी 3 वर्षों से ज़िंदा रही है और उस समय के दौरान जिन फाइलों का मैं उल्लेख कर रहा हूं उनमें से एक बड़ा प्रतिशत 'एसवीएन हटा दिया गया है'। बड़ी बाइनरी फाइलों की समस्या भी है जो विकास के दौरान प्रवाह में थे (जैसे बड़े PSDs) जो तब से ठोस हो गए हैं और अब नहीं बदलेंगे - इसलिए 20 एमबी में डेल्टा में ऐसी फ़ाइल के लिए काम करता है (जो मैं ' मुझे यकीन नहीं है कि कैसे ढूंढें)। – InvertedAcceleration

+0

मैंने यह सुनिश्चित करने के लिए आपके उत्तर के आधार पर प्रश्न को काफी हद तक अपडेट किया है कि मैं स्थिति को सही तरीके से संप्रेषित कर रहा हूं। मुझे उम्मीद है कि यह कई बिंदुओं को स्पष्ट करने में मदद करता है। प्रारंभिक उत्तर के लिए धन्यवाद। – InvertedAcceleration

1

यदि आपने "एसवीएन हटाएं" का उपयोग करके भंडार से फ़ाइलों को हटा दिया है, तो आपने वास्तव में फ़ाइलों को हटाया नहीं है। यह एसवीएन की सुंदरता होगी। एक बार फ़ाइल को रिपोजिटरी में जोड़ा जाने के बाद, यह हमेशा के लिए होता है (जब तक डंप & लोड का उपयोग नहीं किया जाता है)। फ़ाइलों को "हटाने" पर, आप वास्तव में एक नया संशोधन बनाते हैं जो हटाने को चिह्नित करता है, लेकिन पिछले संशोधन में फ़ाइलें मौजूद रहती हैं।

मैंने कुछ डंप & लोड किया है, लेकिन बहुत अधिक भंडार के लिए। लगभग 60,000 (!!!) संशोधन। इसमें समय लगता है लेकिन अंत में, सावधानीपूर्वक लोड करने के बाद, भंडार फिर से बनाया गया है।

आपका एकमात्र तरीका उन संशोधनों को सूचीबद्ध करना है जिन्हें फ़ाइलों को जोड़ा गया, संशोधित और हटा दिया गया था। फिर संशोधन के बीच में डंप करें, और उन्हें सही क्रम में लोड करें। सावधान रहें, गलतियों के लिए कोई जगह नहीं है। यदि आप कोई गलती करते हैं, तो आपको शुरू करना होगा। शुरुआत से लोड & डंप।

मेरा सुझाव, यदि बड़ी फाइलें ऐसी समस्या हैं, तो इतिहास के साथ एक नया ताज़ा भंडार बनाने पर विचार करें। इतिहास की तुलना के लिए पुराने को रखें, और ताजा से काम करना शुरू करें।

गुड लक।

0

बस एक छोटा विचार, आप कहते हैं कि भंडार की वर्तमान स्थिति (वर्तमान सिर) अच्छा है, यानी बड़ी बाइनरी फाइलें अतीत में svn हटा दी गई हैं। इसलिए आपकी समस्या पूरी तरह से भंडार का आकार है?

मुझे पता है कि आपने कहा है कि आप सभी प्रतिबद्धता इतिहास रखना चाहते हैं, लेकिन एक विकल्प के रूप में, आप दो संशोधन कर सकते हैं, एक संपूर्ण संशोधन इतिहास के लिए, और वर्तमान हेड संशोधन के लिए एक।

यदि आप डीवीडी पर पूर्ण डंप डालते हैं तो उदाहरण के लिए यदि आपके पास कभी भी इसकी आवश्यकता होती है तो डेटा उपलब्ध होगा, लेकिन फिर आप पूरे भंडार को हटा सकते हैं और svn संशोधन डंप लोड कर सकते हैं, जिससे आप एक छोटे से साफ भंडार को छोड़ सकते हैं ।

यह भी नहीं बल्कि सिर्फ सिर से बाद एक विशिष्ट संशोधन से डंप करने के लिए, तो उदाहरण के लिए आप संशोधन की पिछले 3 महीने के रखने के लिए और सब कुछ एक डीवीडी करने के लिए पर पुराने डंप कर सकता है संभव है ....

8

for r in `svn log -q | grep ^r | cut -d ' ' -f 1 | tr -d r`; do 
    echo "revision $r is " `svn diff -c $r | wc -c` " bytes"; 
done 

तुम भी खोजने के लिए कुछ इस तरह की कोशिश कर सकते: Otherside सही svnadmin dump के बारे में, आदि इस तरह आप अपने रेपो के लिए डेटा के बहुत सारे जोड़ा संशोधन करने के लिए एक मोटा सूचक मिल जाएगा, और svndumpfilter के लिए उम्मीदवार हैं है संशोधन जो किसी विशेष एक्सटेंशन (यहां, .jpg) के साथ फ़ाइलें जोड़ते हैं:

svn log -vq | egrep "^r|\.jpg$" | grep -B 1 "\.jpg$" 
1

तुम सिर्फ अपमानजनक करता और आप सर्वर भंडार की मेजबानी के लिए उपयोग किया खोजने के लिए की जरूरत है: भंडार की db/revs उपनिर्देशिका में बड़ी फ़ाइलों को देखने के लिए (यह मानते हुए यह FSFS स्वरूप का उपयोग करता)।

0

Otherside के जवाब पर विस्तार से चर्चा करते है, यहाँ क्या विशेष रूप से मेरे लिए काम किया:

svnadmin create new-repo 
svnadmin dump old-repo | svndumpfilter exclude --pattern '*.exe' '*.jpg' '*.png' | svnadmin load new-repo 

आप उन्हें svndumpfilter आदेश को जोड़कर अपने Obj और Bin निर्देशिकाओं को निकालने की सक्षम हो सकता है - मैं इसे कोशिश नहीं की।

इसके अलावा, सबवर्सन के fsfs-stats कार्यक्रम (सबवर्सन 1.8 में नए, svnfsfs stats द्वारा 1.9 में द्वारा प्रतिस्थापित) फ़ाइल प्रकार और विशिष्ट फ़ाइलों कि अपने भंडार को भरने कर रहे हैं मात्र निर्धारण के लिए उपयोगी हो सकता है।

यह बाद में खजाने की तुलना के लिए उपयोगी हो सकता है:

colordiff -u <(svn log -v file:///.../old-repo) <(svn log -v file:///.../new-repo) 
संबंधित मुद्दे