2012-07-09 5 views
7

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

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

यह स्क्रिप्ट के लिए एक छोटे से रेपो माना जाता रहा है, लेकिन अब के बारे में :-(

उत्तर

6

चेक इस बाहर https://help.github.com/articles/remove-sensitive-data आकार में 700M है। यहाँ वे अपना Git रिपोजिटरी से संवेदनशील डेटा को हटाने के बारे में लिखने, लेकिन आप बहुत अच्छी तरह से उपयोग कर सकते हैं अपने प्रतिबद्ध से बड़ी फ़ाइलों को दूर करने के लिए यह।

+1

मैं इस गाइड से पहले चला गया हूं, लेकिन काम करने के बाद क्या हुआ? लोग पहले ही राक्षस प्रतिबद्धता खींच चुके हैं। ऐसा होने की संभावना है कि कोई व्यक्ति स्थानीय प्रतिबद्धता करेगा और उसके बाद एक धक्का देगा, यह चिल्लाएगा कि उसे विलय की जरूरत है, इसलिए वे विलय और धक्का देंगे और राक्षस प्रतिबद्धता फिर से वापस आ जाएगी। मैं यह कैसे सुनिश्चित करूं कि ऐसा नहीं होता है (उन सभी को ईमेल करने के लिए ईमेल करने की संभावना नहीं है!) – agentgonzo

+0

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

+0

संखा, यह उन्हें धक्का देने से नहीं रोकता है - यह उन्हें प्रतिबद्ध होने से रोकता है। इसलिए जब वे पहले ही प्रतिबद्ध हो चुके हैं, तो एक धक्का उन्हें वापस रखेगा। – agentgonzo

8

अराजकता से बचने के लिए सबसे आसान तरीका भी सर्वर अधिक डिस्क दे रहा है।

यह एक कठिन एक है। फ़ाइलें निकाली जा रही उन्हें इतिहास से निकालने की आवश्यकता है,, जो केवल git filter-branch के साथ किया जा सकता है। यह आदेश, उदाहरण के लिए, wo uld इतिहास से <file> निकालें:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <file>' \ 
--prune-empty --tag-name-filter cat -- --all 

समस्या यह पुनर्लेखन SHA1 हेश, टीम में सभी अर्थ नई शाखा संस्करण या जोखिम कुछ गंभीर सिर दर्द को रीसेट करना होगा है। यह सब ठीक है और अच्छा है अगर कोई भी प्रगति पर काम नहीं कर रहा है और आप सभी विषय शाखाओं का उपयोग करते हैं। यदि आप अधिक केंद्रीकृत हैं, तो आपकी टीम बड़ी है, या उनमें से कई काम करते समय गंदा काम करने वाली निर्देशिका रखते हैं, अराजकता और विवाद के बिना ऐसा करने का कोई तरीका नहीं है। आप हर किसी के स्थानीय काम को सही तरीके से प्राप्त करने में काफी समय व्यतीत कर सकते हैं। लिखा है, git filter-branch शायद सबसे अच्छा समाधान है। बस सुनिश्चित करें कि आपके पास एक योजना है, आपकी टीम इसे समझती है, और आप सुनिश्चित करते हैं कि अगर वे कुछ महत्वपूर्ण काम प्रगति में गुम हो जाते हैं या उलझ जाते हैं तो वे अपने स्थानीय भंडार का बैक अप लेते हैं।

एक संभव योजना होगा:

  1. प्रगति में अपने काम, git diff > ~/my_wip की तरह कुछ के धब्बे उत्पन्न करने के लिए टीम प्राप्त करें।
  2. टीम को उनके प्रतिबद्ध लेकिन बिना काम किए गए काम के लिए पैच जेनरेट करने के लिए प्राप्त करें: git format-patch <branch>
  3. रन git filter-branch। सुनिश्चित करें कि टीम यह हो रही है कि खींचने के लिए नहीं जानता है।
  4. टीम को git fetch && git reset --hard origin/<branch> जारी करें या उन्हें फिर से संग्रह को क्लोन करें।
  5. git am <patch> के साथ अपने पहले किए गए कार्य को लागू करें।
  6. git apply के साथ अपने काम को प्रगति पर लागू करें, उदा। git apply ~/my_wip
+0

सर्वर को और डिस्क स्थान देना वास्तव में एक आदर्श समाधान नहीं है क्योंकि घर से काम करने वाले लोगों को अभी भी कई सौ केबी होने पर अपने ब्रॉडबैंड कनेक्शन के माध्यम से कई सौ एमबी खींचना होगा। मुझे बस एक फ़िल्टर-शाखा करना पड़ सकता है और एक बड़ी ईमेल भेजनी पड़ती है, "आपकी सामग्री विफल हो जाएगी - अपने स्थानीय परिवर्तनों को छीन लें, पैच के रूप में निर्यात करें और फिर अपने स्थानीय रेपो को हटाएं - फिर फिर से हटाएं" – agentgonzo

+0

हाँ, मैंने एक समस्या को देखा यह कुछ महीने पहले। आपका विचार ठीक वही है जो मैंने किया था, सिवाय इसके कि मेरे सहकर्मी पैच के बारे में थोड़ा सा स्कीटिश थे। मैं उनके लिए यह कर समाप्त हो गया। इसमें दोपहर लग गए मैंने आपकी योजना को शामिल करने के लिए उत्तर संपादित किया, और अगर किसी ने बाद में इस पर ठोकर खाई तो कुछ कमांड जोड़े। – Christopher

4

अन्य उत्तरों के अलावा, आप भविष्य में विशाल जार फ़ाइलों के खिलाफ कुछ पूर्व-सुरक्षात्मक सुरक्षा को जोड़ने पर विचार करना चाहेंगे, जो रेपो में प्री-प्राप्त हुक के रूप में है जो उपयोगकर्ताओं को प्रतिबंधित करता है (या कम से कम " गैर-व्यवस्थापक उपयोगकर्ता ") बहुत बड़ी फ़ाइलों को धक्का देने से, या *.jar नाम की फ़ाइलों, या जो भी सबसे अच्छा लगता है।

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

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

0

फ़िल्टर-शाखा का उपयोग करें!

git filter-branch -f --prune-empty -- --all 
+0

'--index-filter' अनिवार्य रूप से' --tree-filter' जैसा ही हो सकता है, लेकिन तेज़। –

-1

एक ईकाई पुरुष यहाँ:

git filter-branch --tree-filter 'find . -name "*.jar" -exec rm {} \;' 

तो बस सब करता साथ उन में किसी भी फाइल की जरूरत नहीं है कि शुद्ध। यहां तक ​​कि सोचा कि यह मुख्य रूप से एक Git सवाल यह है कि, मैं दो बातें पेशकश करना चाहते हैं:

  1. Starting in GForge 6.3, साइट व्यवस्थापक परियोजनाओं है कि बहुत ज्यादा डिस्क का उपयोग कर रहे हैं, साथ ही पुराने और अनाथ परियोजनाओं की पहचान कर सकते हैं। यह आपको पूर्ण-डिस्क स्थितियों से बचने में मदद कर सकता है, खासकर यदि आपके पास बहुत अलग टीम और परियोजनाएं हैं।
  2. GForge में आसान करने के लिए गिट हुक (सामान्य रूप से एससीएम हुक) को कार्यान्वित करना। साइट प्रशासक किसी भी हुक कमांड को कॉन्फ़िगर कर सकते हैं, और प्रोजेक्ट-स्तरीय लोग तब चुन सकते हैं कि वे अपनी परियोजना के लिए कौन से हुक चाहते हैं। एक हुक जोड़ना जो फाइल के कुछ प्रकार (या आकार?) को रोकता है, इस सुविधा के लिए एक अच्छा फिट होगा।