Git (संख्या और आकार) में फ़ाइल सीमाएँ क्या हैं?


175

क्या किसी को पता है कि फ़ाइलों की संख्या और फ़ाइलों के आकार के लिए Git सीमा क्या है?


विंडोज पर, अधिकतम फ़ाइल 4 जीबी है (जुलाई 2020 तक), बग के कारण: github.com/git-for-windows/git/issues/1063
cowlinator

जवाबों:


161

खुद लिनुस का यह संदेश आपको कुछ अन्य सीमाओं के साथ मदद कर सकता है

[...] सीवीएस, यानी यह वास्तव में "एक समय में एक फ़ाइल" मॉडल के लिए बहुत अधिक उन्मुख हो रहा है।

जो इसमें अच्छा है कि आपके पास एक लाख फाइलें हो सकती हैं, और फिर उनमें से कुछ की ही जांच करें - आप कभी भी अन्य 999,995 फाइलों के प्रभाव को भी नहीं देख पाएंगे।

मूल रूप से Git वास्तव में कभी भी पूरे रेपो से कम नहीं दिखता है। यहां तक ​​कि अगर आप चीजों को थोड़ा सीमित करते हैं (यानी सिर्फ एक हिस्से की जांच करें, या इतिहास को थोड़ा सा पीछे ले जाएं), तो गित समाप्त हो जाती है फिर भी हमेशा पूरी चीज की देखभाल करते हैं, और ज्ञान को चारों ओर ले जाते हैं।

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

और हाँ, फिर "बड़ी फ़ाइल" समस्याएँ हैं। मैं वास्तव में नहीं जानता कि बड़ी फ़ाइलों के बारे में क्या करना है। हम उन्हें चूसते हैं, मुझे पता है।

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

जैसा कि तल्ज़ो के उत्तर से स्पष्ट है , सीमा एक सिस्टम एक (बड़ी संख्या में फ़ाइलें) हो सकती है, लेकिन यदि आप गिट की प्रकृति को समझते हैं (इसके SHA-1 कुंजी द्वारा प्रस्तुत डेटा सुसंगतता के बारे में), तो आपको सही सीमा का एहसास होगा " एक उपयोग है: यानी, आपको एक Git रिपॉजिटरी में सब कुछ स्टोर करने की कोशिश नहीं करनी चाहिए , जब तक कि आप हमेशा सब कुछ वापस पाने के लिए तैयार न हों। कुछ बड़ी परियोजनाओं के लिए, इसका कोई मतलब नहीं होगा।


Git सीमा पर एक अधिक गहराई से देखने के लिए, "देख Git बड़ी फ़ाइलों के साथ "
(जो उल्लेख है Git-LFS ।: एक समाधान Git रेपो बाहर बड़ी फ़ाइलों को स्टोर करने के लिए GitHub अप्रैल 2015)

Git repo को सीमित करने वाले तीन मुद्दे:

  • बड़ी फाइलें ( पैकफिल के लिए xdelta केवल स्मृति में है, जो बड़ी फ़ाइलों के साथ अच्छा नहीं है)
  • बड़ी संख्या में फाइलें , जिसका अर्थ है, एक फाइल प्रति बूँद और एक समय में एक पैकेट बनाने के लिए धीमी gc gc।
  • विशाल packfiles , एक packfile सूचकांक अक्षम (विशाल) packfile से डेटा पुनः प्राप्त करने के साथ।

एक और हालिया धागा (फरवरी 2015) एक गिट रेपो के लिए सीमित कारकों को दर्शाता है :

केंद्रीय सर्वर से कुछ एक साथ क्लोन भी अन्य उपयोगकर्ताओं के लिए अन्य समवर्ती संचालन धीमा कर देगा?

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

क्या ' git pull' धीमी होगी?

यदि हम सर्वर साइड को बाहर करते हैं, तो आपके पेड़ का आकार मुख्य कारक है , लेकिन आपकी 25k फाइलें ठीक होनी चाहिए (लिनक्स में 48k फाइलें हैं)।

' git push'?

आपके रेपो का इतिहास कितना गहरा है, या आपका पेड़ कितना चौड़ा है, यह इससे प्रभावित नहीं है, इसलिए जल्दी करना चाहिए ।।

आह refs की संख्या दोनों को प्रभावित कर सकता git-pushहै और git-pull
मुझे लगता है कि स्टीफन इस क्षेत्र में मुझसे बेहतर जानता है।

' git commit'? (इसे संदर्भ 3 में धीमी गति से सूचीबद्ध किया गया है ।) ' git status'? (संदर्भ 3 में फिर से धीमा हालांकि मैं इसे नहीं देखता।)
(भी git-add)

फिर से, अपने पेड़ का आकार। आपके रेपो के आकार पर, मुझे नहीं लगता कि आपको इसके बारे में चिंता करने की आवश्यकता है।

हो सकता है कि कुछ संचालन दिन-प्रतिदिन के लिए न हों, लेकिन अगर उन्हें अक्सर वेब फ्रंट-एंड द्वारा गिटलैब / स्टैश / गीथहब आदि कहा जाता है, तो वे अड़चन बन सकते हैं। (उदाहरण के लिए ' git branch --contains' बड़ी संख्या में शाखाओं से बहुत अधिक प्रभावित होता है।)

git-blame धीमी हो सकती है जब किसी फ़ाइल को बहुत संशोधित किया जाता है।


4
@ Thr4wn: GitPro सबमॉड्यूल पृष्ठ पर अधिक जानकारी के लिए stackoverflow.com/questions/1979167/git-submodule-update/… भी देखें । एक छोटे संस्करण के लिए: stackoverflow.com/questions/2065559/…
VONC

1
Git सबमल्स डॉक्यूमेंट के लिए अपडेटेड लिंक = git-scm.com/book/en/Git-Tools-Submodules
JHowIX

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

"वास्तव में बुरी तरह से तराजू अगर आप इसे सब कुछ एक विशाल भंडार के रूप में देखने के लिए मजबूर करते हैं " तो यह मोनोरैप्स की मापनीयता के बारे में क्या कहता है?
पंचांग

@ephemer क्या कहते हैं ... कि प्रशस्ति पत्र 10 साल पहले से है। तब से, 2017 में, Microsoft के पास अपना खुद का monorepo ( devblogs.microsoft.com/bharry/… : 300GB +) है और सुधार अभी भी 2019 में आगे बढ़ रहे हैं: stackoverflow.com/a/57129687/6309
VONC

36

कोई वास्तविक सीमा नहीं है - सब कुछ 160-बिट नाम के साथ नाम दिया गया है। फ़ाइल का आकार 64 बिट संख्या में प्रतिनिधित्व करने योग्य होना चाहिए ताकि वहां कोई वास्तविक सीमा न हो।

हालांकि एक व्यावहारिक सीमा है। मेरे पास एक रिपॉजिटरी है जो ~ 8,000> 880,000 फाइलों के साथ है और git gc में कुछ समय लगता है। काम करने वाला पेड़ बहुत बड़ा होता है इसलिए पूरे कामकाजी निर्देशिका का निरीक्षण करने में काफी समय लगता है। इस रेपो का उपयोग केवल डेटा स्टोरेज के लिए किया जाता है, हालांकि, यह केवल स्वचालित टूल का एक गुच्छा है जो इसे संभालता है। रेपो से परिवर्तनों को खींचना, समान डेटा को rsyncing की तुलना में बहुत तेज है।

%find . -type f | wc -l
791887
%time git add .
git add .  6.48s user 13.53s system 55% cpu 36.121 total
%time git status
# On branch master
nothing to commit (working directory clean)
git status  0.00s user 0.01s system 0% cpu 47.169 total
%du -sh .
29G     .
%cd .git
%du -sh .
7.9G    .

2
यद्यपि सैद्धांतिक सीमाओं के बारे में बात करने के ऊपर "अधिक सही" उत्तर है, यह उत्तर मेरे लिए अधिक उपयोगी लगता है क्योंकि यह आपकी खुद की स्थिति की तुलना करने की अनुमति देता है। धन्यवाद।
बाननेविज़न

1
बहुत ही रोचक। यह कैसे संभव है कि वर्किंग कॉपी .gitडायरेक्टरी से बड़ी है ? मेरी भोली धारणा यह थी कि .gitइसमें वर्किंग डायरेक्टरी और इतिहास की एक प्रति शामिल है, इसलिए इसे बड़ा होना चाहिए। क्या कोई मुझे संसाधन समझ के बारे में बता सकता है कि ये आकार कैसे संबंधित हैं?
bluenote10

1
@ bluenote10 .gitनिर्देशिका में सामग्री संपीड़ित है। तो अपेक्षाकृत कुछ कमिट के साथ एक रिपॉजिटरी के असम्पीडित वर्किंग डायरेक्टरी की तुलना में एक छोटा संकुचित इतिहास होने की संभावना है। मेरा अनुभव बताता है कि व्यवहार में, C ++ कोड के साथ, पूरा इतिहास आम तौर पर कार्यशील निर्देशिका के समान आकार के बारे में है।
प्रैपिन

28

यदि आप ऐसी फाइलें जोड़ते हैं जो बहुत बड़ी हैं (मेरे मामले में जीबी, साइगविन, एक्सपी, 3 जीबी रैम), तो यह अपेक्षा करें।

घातक: स्मृति से बाहर, मॉलॉक विफल रहा

अधिक जानकारी यहाँ

अद्यतन 3/2/11: कछुआ गिट के साथ विंडोज 7 x64 में देखा गया। टोंस ऑफ़ मेमोरी का उपयोग, बहुत धीमी प्रणाली प्रतिक्रिया।


17

फरवरी 2012 में, जोशुआ रेडस्टोन की एक बड़ी सॉफ्टवेयर रिपॉजिटरी में Git मेलिंग सूची में , जोशुआ रेडस्टोन से एक बहुत ही दिलचस्प सूत्र था, Git का परीक्षण कर रहा था:

टेस्ट रेपो में 4 मिलियन कमिट्स, लीनियर हिस्ट्री और लगभग 1.3 मिलियन फाइल्स हैं।

चलाए गए परीक्षण बताते हैं कि इस तरह के रेपो गिट के लिए अनुपयोगी (ठंडा ऑपरेशन स्थायी मिनट) है, लेकिन यह भविष्य में बदल सकता है। मूल रूप से प्रदर्शन stat()कर्नेल एफएस मॉड्यूल को कॉल की संख्या से दंडित किया जाता है , इसलिए यह रेपो में फ़ाइलों की संख्या और एफएस कैशिंग दक्षता पर निर्भर करेगा। इस Gist को आगे की चर्चा के लिए भी देखें ।


2
+1 दिलचस्प। यह बड़ी फ़ाइलों / फ़ाइलों की संख्या / packfiles पर सीमाओं का विस्तार git सीमाओं के बारे में मेरे अपने जवाब गूँजती है।
VONC


2

यह इस बात पर निर्भर करता है कि आपका अर्थ क्या है। व्यावहारिक आकार सीमाएं हैं (यदि आपके पास बहुत बड़ी फाइलें हैं, तो यह बोरिंग धीमा हो सकता है)। यदि आपके पास बहुत सारी फाइलें हैं, तो स्कैन भी धीमा हो सकता है।

मॉडल के लिए वास्तव में अंतर्निहित सीमाएं नहीं हैं, हालांकि। आप निश्चित रूप से इसका खराब उपयोग कर सकते हैं और दुखी हो सकते हैं।


1

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


1

मेरे पास डेटा की एक उदार राशि है जो मेरे रेपो में व्यक्तिगत JSON टुकड़े के रूप में संग्रहीत है। कुछ निर्देशिकाओं के तहत लगभग 75,000 फाइलें बैठी हैं और यह वास्तव में प्रदर्शन के लिए हानिकारक नहीं है।

पहली बार में उन्हें जाँचना, जाहिर है, थोड़ा धीमा था।


1

मैंने पाया कि रेपो में बड़ी संख्या में फाइलों (350k +) को संग्रहीत करने की कोशिश की जा रही है। हां, स्टोर करें। हंसते हुए कहते हैं।

$ time git add . 
git add . 333.67s user 244.26s system 14% cpu 1:06:48.63 total

Bitbucket प्रलेखन से निम्नलिखित अर्क काफी दिलचस्प हैं।

जब आप डीवीसीएस रिपॉजिटरी क्लोनिंग के साथ काम करते हैं, तो आप पूरे रिपॉजिटरी और उसके इतिहास के साथ काम कर रहे होते हैं। व्यवहार में, एक बार जब आपका भंडार 500MB से बड़ा हो जाता है, तो आप मुद्दों को देखना शुरू कर सकते हैं।

... Bitbucket के 94% ग्राहकों के पास रिपॉजिटरी हैं जो 500MB से कम के हैं। लिनक्स कर्नेल और Android दोनों 900MB से कम के हैं।

उस पृष्ठ पर अनुशंसित समाधान आपकी परियोजना को छोटे टुकड़ों में विभाजित करना है।


मुझे लगता है कि यह काफी पुराना है। अभी, जिस साइट पर आप लिंक कर रहे हैं, उस पर android (न ही linux) रेपो के बारे में कुछ भी नहीं लगता है। लेकिन मुझे आश्चर्य है कि अगर यह गलत नहीं था तो भी वापस? जैसे इस उत्तर की तुलना करें । शायद उनका मतलब कुछ और था?
jjj

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.