2009-11-19 18 views
10

से बड़ी फ़ाइलों को प्रबंधित करने के लिए गिट लायक है, मैं संस्करण नियंत्रण के तहत एक बड़ी मात्रा में डेटा डाल सकता हूं, यानी एक निर्देशिका संरचना (गहराई < = 5 के साथ) सैकड़ों फाइलों के साथ 500 एमबी आकार के साथ)।500 एमबी

चीजें मैं जरूरत है एक प्रणाली है कि मेरी मदद है: - एक फ़ाइलों बदल दिया गया हो पता लगाने के लिए - पता लगाने के लिए अगर फ़ाइलों जोड़ा गया था/हटाया - किसी अन्य स्थान में पूरे भंडार क्लोन करने के लिए - एक स्टोर करने के लिए "चेकपॉइंट" और बाद में इसे पुनर्स्थापित करें

मुझे परिवर्तन का पता लगाने के लिए sha1 की आवश्यकता नहीं है, कुछ तेज़ी से स्वीकार्य है।

क्या इसके लिए गिट लायक है? एक बेहतर विकल्प है?

उत्तर

10

जैसा कि मैंने "What are the Git limits" में उल्लेख किया है, गिट बड़ी फ़ाइलों (या उस मामले के लिए बड़ी बाइनरी फाइलों) को प्रबंधित करने के लिए नहीं बनाया गया है।

Git अगर आप की जरूरत की जरूरत होगी:

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

नोट: अभी भी Git का उपयोग कर, तुम कोशिश कर सकते this approach

दुर्भाग्य से, rsync नहीं हमारे उद्देश्यों के लिए वास्तव में सही या तो है।

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

ठीक है, क्या एक और विचार के बारे में: के टुकड़ों में फ़ाइल विभाजित हैं, और Git अलग में उन ब्लॉकों में से प्रत्येक की जाँच करें।
फिर Git के डेल्टा संपीड़न एक समय में पर चबाने के लिए बहुत ज्यादा नहीं होगा, और हम केवल संशोधित ब्लॉक भेजने के लिए है ...

, gzip --rsyncable के आधार पर एक POC available in this Git repo साथ।

0

हो सकता है कि rsync की तरह कुछ अपनी आवश्यकताओं के लिए बेहतर है (यदि आप बस कुछ बैकअप चाहते, कोई संगामिति, इसे मिलाना शाखाओं आदि)

1

Unison File Synchroniser बड़े बाइनरी फ़ाइलें की कई प्रतियां बनाए रखने के लिए एक उत्कृष्ट उपकरण है। यह चेकपॉइंट संग्रहीत करने के अलावा आप जो कुछ भी मांगते हैं वह करेगा - लेकिन आप एक rsync हार्डलिंक प्रतिलिपि के साथ कर सकते हैं।

1

आप एक यूनिक्स प्रणाली पर हैं (शायद जाती हैं क्योंकि आप Git का उपयोग कर रहे):

  • सभी छोटे सामान के लिए एक Git रेपो का प्रयोग करें।
  • एक ही "big_files" फ़ोल्डर से बड़ी फ़ाइलों को अपने भंडार के भीतर उचित स्थानों पर सिम्लिंक करें।
  • अधिक पारंपरिक-गैर-संस्करण बैकअप सिस्टम का उपयोग करके big_files फ़ोल्डर का बैकअप लें, यदि आप दूसरों को पास करने की आवश्यकता हो तो समय-समय पर एक ज़िप फ़ाइल में बंडल करें।

इस तरह, आप Git का लाभ प्राप्त है, तो आप जो कुछ भी वृक्ष संरचना आप चाहते हैं रखने के लिए, और बड़े आकार फ़ाइलों को अभी भी अंदर सामान्य फ़ोल्डर पदानुक्रम प्रतीत होने के बावजूद कहीं और ऊपर का समर्थन कर रहे हैं।

8

गिट-एनेक्स इस समस्या का समाधान है। बड़े फ़ाइल डेटा को सीधे गिट में संग्रहीत करने के बजाय, यह इसे एक कुंजी/मूल्य स्टोर में संग्रहीत करता है। चाबियों के लिए सिम्लिंक को वास्तविक बड़ी फ़ाइलों के लिए प्रॉक्सी के रूप में गिट में चेक किया जाता है।

http://git-annex.branchable.com

संबंधित मुद्दे