Git में बड़े फ़ाइलों का भविष्य खुद Git है
(tylercipriani.com)- Git project ने हाल ही में आधिकारिक रूप से बड़े फ़ाइल प्रबंधन की समस्या को सीधे हल करना शुरू किया है
- Git LFS यूज़र्स के लिए कई तरह की लागत, vendor lock-in आदि पैदा करने वाला एक अस्थायी उपाय है
- हाल की partial clone सुविधा के साथ अब Git खुद ही LFS की ज़्यादातर भूमिका को बदल सकता है
- आगे large object promisor नाम का एक नया समाधान भी आधिकारिक Git में इंटीग्रेट होने की तैयारी में है
- इन बदलावों के साथ बड़े फ़ाइल प्रबंधन का अंतिम समाधान किसी बाहरी extension की बजाय खुद Git पर आकर टिकने की संभावना है
Git में बड़े फ़ाइलों की समस्या और बदलाव
- अगर Git का सबसे बड़ा nemesis कोई है, तो वह है बड़ी फ़ाइलें
- बड़ी फ़ाइलें Git repository को फुला देती हैं,
git cloneकी गति कम करती हैं, और ज़्यादातर hosting environments पर भी बुरा असर डालती हैं
Git LFS का आगमन और सीमाएँ
- 2015 में GitHub ने बड़े फ़ाइलों की समस्या को बायपास करने के लिए Git LFS जारी किया
- लेकिन Git LFS खुद नई complexity और storage cost जोड़ देता है
- Git community चुपचाप बड़े फ़ाइलों की मूल समस्या पर विचार करती रही है, और हाल की Git की आधिकारिक रिलीज़ में LFS के बिना बड़े फ़ाइलों को मैनेज करने की नई दिशा सामने आई है
आज ही अपनाया जा सकने वाला तरीका: Git LFS को partial clone से बदलना
-
partial clone कैसे काम करता है
- Git LFS: बड़ी फ़ाइलों को repository के बाहर रखा जाता है, और काम करते समय केवल ज़रूरी फ़ाइलें डाउनलोड की जाती हैं
- Git partial clone (2017 में पेश किया गया):
--filteroption से तय आकार से बड़े blobs को छोड़कर clone करना- ज़रूरत पड़ने पर केवल वही बड़ी फ़ाइलें सर्वर से डाउनलोड करना
Partial clone का उपयोग करने पर Clone और Fetch के दौरान [बड़ी binary assets] को पहले से डाउनलोड करने की ज़रूरत नहीं पड़ती, जिससे download time और disk usage कम होता है
-
partial clone और LFS में समानताएँ
- 1. checkout size को न्यूनतम रखना: सिर्फ़ latest version लिया जाता है और पूरी file history छोड़ी जाती है
- 2. तेज़ clone: बड़ी फ़ाइलों का transfer नहीं होने से clone तेज़ होता है
- 3. तेज़ setup: shallow clone के विपरीत, पूरे project history तक पहुँचना संभव रहता है
-
partial clone के उपयोग का उदाहरण
- बहुत अधिक large PNG file history वाले repo की clone speed और disk usage का उदाहरण:
- सामान्य clone में लगभग 4 मिनट और 1.3GB space लगता है
- partial clone और 100KB blob limit लगाने पर 6 सेकंड में clone, 49MB उपयोग
- मूल की तुलना में clone speed 97% बेहतर, checkout size 96% कम
- बहुत अधिक large PNG file history वाले repo की clone speed और disk usage का उदाहरण:
-
partial clone की सीमाएँ
- जब filtered data की ज़रूरत होती है (जैसे
git diff,git blame,git checkout), Git सर्वर से फ़ाइल माँगता है - यह Git LFS जैसी ही विशेषता है
- व्यवहार में binary files पर blame करना बहुत कम होता है
- जब filtered data की ज़रूरत होती है (जैसे
Git LFS की समस्याएँ
- उच्च vendor lock-in: GitHub implementation केवल अपने server को support करती है, जिससे शुल्क और निर्भरता पैदा होती है
- लागत की समस्या: 50GB storage पर GitHub LFS की सालाना लागत $40, जबकि Amazon S3 पर $13
- वापस लौटना मुश्किल: एक बार LFS में बदलने के बाद history rewrite किए बिना पुराने रूप में लौटना संभव नहीं
- लगातार setup cost: हर collaborator के लिए LFS install करना ज़रूरी, वरना फ़ाइलों की जगह metadata files दिखती हैं, जिससे भ्रम होता है
आगे की दिशा: Large Object Promisor
- बड़ी फ़ाइलें hosting platforms (GitHub, GitLab) के लिए भी लागत की समस्या पैदा करती हैं
- Git LFS बड़ी फ़ाइलों को CDN पर offload करके server cost कम करता है
-
Large Object Promisor क्या है?
- इस साल की शुरुआत में Git ने large object promisor नाम की सुविधा को आधिकारिक रूप से merge किया
- यह सुविधा LFS की तरह server-side storage burden कम करती है, लेकिन user complexity को काफ़ी घटाती है
यह प्रयास server side के काम को, खासकर उन बड़े blobs के लिए जो पहले से binary format में compressed हैं, बेहतर बनाने के लिए है
यह Git LFS का एक विकल्प बनने वाला समाधान है
– Large Object Promisors, git-scm.com
-
यह कैसे काम करता है
- 1. यूज़र बड़ी फ़ाइलों को Git host पर push करता है
- 2. host backend promisor पर बड़ी फ़ाइलों को offload कर देता है
- 3. clone के समय Git host client को promisor की जानकारी देता है
- 4. client ज़रूरत पड़ने पर उसी promisor से बड़ी फ़ाइलें अपने-आप प्राप्त कर लेता है
-
मौजूदा स्थिति और चुनौतियाँ
- large object promisor अभी development में है, और मार्च 2025 में इसका कुछ code Git में merge हुआ
- GitLab आदि में अतिरिक्त implementation और unresolved issues पर चर्चा जारी है
- व्यापक adoption तक अभी समय लगेगा
- फिलहाल बड़ी फ़ाइल storage के लिए Git LFS पर निर्भरता टालना मुश्किल है
- promisor के फैलने पर GitHub में 100MB से बड़ी फ़ाइलें upload करना भी संभव हो सकता है
निष्कर्ष: Git में बड़े फ़ाइलों का भविष्य Git ही है
- Git project आपकी तरफ़ से बड़ी फ़ाइलों की समस्या पर लगातार काम कर रहा है
- अभी भी Git LFS का उपयोग ज़रूरी है
- लेकिन partial clone और large object promisors के विकास के साथ Git LFS धीरे-धीरे अनावश्यक होता जाएगा, और जल्द ही ऐसा समय आ सकता है जब बड़े फ़ाइलों को सिर्फ़ Git से आसानी से मैनेज किया जा सके
- भविष्य में Git में MP3 library डालने का विचार ही बड़े पैमाने के उपयोग का आख़िरी असली अवरोध रह जाएगा
1 टिप्पणियां
Hacker News टिप्पणियाँ
पुराने
svnके समय में भी 150GB की working directory, जिसमें बहुत सारी बड़ी binary files हों, बिना किसी खास समस्या के ठीक चलती थी, जबकिgitऐसा नहीं कर पाता। यह जानने की जिज्ञासा है किsvnबड़ी binary files के लिएgitसे अलग कौन-सा approach अपनाता है, और क्याgitभी वैसा नहीं कर सकता। इसके अलावा, binary data के साथ काम करते समय file locking एक ज़रूरी feature है; ताकि किसी खास file पर एक समय में सिर्फ एक व्यक्ति काम करे और बाकी लोग उसे read-only रखें, जिससे उलझाऊ merge समस्याओं से बचा जा सके। बड़ी files को बाहर offload करने से वास्तव में performance या reliability की समस्या बेहतर होती है या नहीं, यह भी साफ़ नहीं है। आख़िर repository तो repository ही है, बस जगह अलग है। offload करना असल में public git forge द्वारा बड़ी files के storage cost से बचने का तरीका लगता हैgitऔरsvnका design पूरी तरह अलग है।gitपूरी तरह distributed है, इसलिए हर repository को हर file की पूरी history रखनी पड़ती है, और locking की धारणा वहाँ मायने नहीं रखती। project के हिसाब से version control system चुनना चाहिए; यह ज़रूरी नहीं किgitहर काम के लिए universal होLarge object promisors का concept पसंद आया। अगर
S3जैसी जगह को आसानी से जोड़कर इस्तेमाल किया जा सके, तो शायद मौजूदाLFSसे तुरंत migrate करूँ। बड़ी binary files का version control करते समयS3के साथ अच्छा synergy बनता है। intelligent tiering की वजह से data पुराना होने पर अपने-आप सस्ती storage tier में चला जाता है, यह भी फ़ायदा है। 10 साल पुराने data को restore करने में आधा दिन लग जाए तो भी कोई दिक्कत नहींमैं भी यही सोचता हूँ। समझ नहीं आता कि शुरू से यह default तरीका क्यों नहीं था। मैं एक छोटा
git LFSserver खुद चला रहा हूँ, और अगरgitसिर्फS3को native support दे दे, तो मैं तुरंत switch करने को तैयार हूँअपनी मौजूदा नौकरी में हम cost बचाने के लिए
LFSobjects को bucket में cache कर रहे हैं। हरPRrun परgit lfs ls-filesसे file list लेते हैं,gcpसे fetch करते हैं,git lfs checkoutसे objects को local में store करते हैं, फिरpullसे सिर्फ जो छूट गए हों वही और लेते हैं। जो files cached नहीं होतीं, उन्हेंgcloud storage rsyncसे वापस bucket में upload कर देते हैं। developer के नज़रिए से कोई अतिरिक्त setup नहीं चाहिए; बस नए objectspullहो जाते हैं, औरGitHub UIमें भी repository state को लेकर कोई confusion नहीं होता। पहले सोचा था कि अपनाLFSbackend खड़ा करें, लेकिन इस तरीके ने अभी की सबसे बड़ी समस्या हल कर दी।GitHubपरLFSfiles कोCIमें हर बार लेने पर traffic charge बहुत ज़्यादा पड़ता था, और cache की 10GB limit तथा branches के बीच sharing न होने की वजह से हर बार फिर से डाउनलोड करना पड़ता था। cache capacity को पैसे देकर भी बढ़ाना चाहता था, लेकिन वह विकल्प भी नहीं था। इसे developers पर लागू करना भी आसान है; बस एकgit hookजोड़ना होता हैक्या
S3Amazon से जुड़ी service है?Git LFSकी कई कमियाँ गिनाने पर सहमत हूँ, लेकिन यह कहना कि इसमें vendor lock-in है, उससे सहमत नहीं हूँ।GitHubopen client और server देता है, इसलिए यह दावा उचित नहीं लगता। हाँ,LFSoffline या sneaker-net workflows में काम नहीं करता; यह आम मामला नहीं है, लेकिन इसका ज़िक्र होना चाहिए। large object promisor ऐसा लगता है जैसेLFSकी client-side complexity को server पर शिफ्ट कर देता है, यानी जटिलता बस जगह बदलती है। अगर architecture ऐसा है कि git server files कोLFSserver और object storage पर upload करता है, तो उसके अपने trade-off होंगे। यह भी जिज्ञासा है कि public git server पर promisor remote को छिपाकर uploads होने पर क्या होगामुझे सच में लगता है कि
LFSकाफ़ी खराब है। server implementation भी बिखरा हुआ है, और object content तथा उसे store करने का तरीका आपस में गड्डमड्ड हैं। opt-in तरीका भी बहुत खराब है; बिना सोचे-समझे इस्तेमाल करो तो असली file की जगह सिर्फ़ छोटी text file बनती है। नया solution बेहतर होगा या नहीं, पता नहीं, लेकिन इतना तय है किLFSअच्छा नहीं हैहाल ही में
Git LFSकी एक और समस्या पता चली: migration ऊपर वाले commits की.gitattributesतक दूषित कर देता है। यानी अगर commits का क्रमA→B→Cहै और सिर्फCमें बड़ी file कोLFSमें जोड़ा गया, तोAऔरBमें भी ऐसी.gitattributesआ जाती है जो मौजूद ही न होने वालीLFSfiles को point करती है। ऐसा इसलिए होता है क्योंकि migration प्रक्रिया.gitattributesको history में उलटी दिशा में propagate कर देती है, और यह नहीं देखती कि current commit में वह entity वास्तव में मौजूद है या नहींपहले
Git LFSमेंSSHsupport नहीं था, इसलिएSSLcertificate लेना अनिवार्य था। इस वजह से घर पर self-hosting करने वालों के लिए entry barrier बन जाता था। लगता हैGitLabने हाल मेंSSHsupport का patch जोड़ा हैsoftware engineering की class में सलाह दी गई थी कि बड़ी files, जैसे media वगैरह,
Gitमें न रखें बल्कि artifact repository (Artifactoryआदि) में रखें। तब उन्हें snapshot dependency के रूप में deploy किया जा सकता है, और build system को इस तरह नियंत्रित किया जा सकता है कि वह सिर्फ़ latest version ही fetch करे। साथ ही, teammates की local machines पर जमा पुरानी files भी सिर्फ़ build system cache साफ़ करते ही हट जाती हैंयह तरीका कुछ हद तक
git submoduleजैसा लगता है। अगर submodule से समस्या हल हो जाती, तो लोग अब तक इसका इस्तेमाल कर चुके होते।git submoduleshallow clone भी support करता है (संबंधित लिंक: https://stackoverflow.com/questions/2144406/how-to-make-shallow-git-submodules). मैंने खुद कभी बड़ी files की समस्या नहीं झेली, इसलिए जानना चाहता हूँ कि अगर यह तरीका काम नहीं करता, तो उसकी वजह क्या है।SOपर बताए गए नुकसान इतने बड़े नहीं लगतेक्या class में
CI/CDsystem architecture भी सिखाया जाता है? आजकल नए engineers पूरे integration stack, जैसेGitLab,Artifactory,CodeSonar,Anchoreआदि, के साथ सहज नहीं होतेइस तरीके की भी कमियाँ हैं।
CI/CDsystem या developers को अतिरिक्त credentials चाहिए होते हैं। commits की प्रक्रिया भी कई चरणों में बढ़ जाती है; पहले artifact ID पता होना चाहिए, और इसे automate करने के लिएgit hookइस्तेमाल करें तो आख़िर में चीज़ें फिरgit-lfsजितनी जटिल हो जाती हैंयह लेख
LFSका अनुचित मूल्यांकन कर रहा है।LFS,GitHubपर निर्भर नहीं है और उसका protocol भी open है।LFSकी कमियाँ,gitextension होने की वजह से कुछ हद तक अपरिहार्य हैं, औरpromisorsभी मूलतः उसी तरह की अवधारणा हैं। फर्क सिर्फ़ इतना है कि इसेgitके अंदर built-in कर देने सेUXथोड़ा बेहतर हो गया हैLFSइस्तेमाल हो जाए, वह हमेशा के लिए lock-in हो जाती है। इस्तेमाल किया गया storage कम करना हो तो पूरी repository delete करनी पड़ती है, और यह बात आधिकारिक रूप से साफ़-साफ़ बताई भी नहीं जाती। हमारी company नेGitHubstatistics का अध्ययन करते समय बड़ी compressed DB files कोLFSमें डाला था, तब यह समस्या सीधे झेलीयह असली solution नहीं है।
git LFSभी बस एक stopgap है, और clone करते समय filter argument डालना भी बुनियादी हल नहीं है।git cloneवह command है जो हर user सबसे पहले सीखता है; ऐसे में हर बार filter याद रखना पड़े, गलती हो जाए तो बहुत समय बर्बाद हो, और सही करने पर भी cloned repository शायद ठीक से काम न करे—यह सही दिशा नहीं है। असली समाधान तोrsyncजैसी संरचना की ओर जाना होगा, जहाँ latest files को पहले कुशलतापूर्वक लाया जाए।gitऐसे बुनियादी बदलाव आसानी से नहीं करतापूरी तरह सहमत हूँ।
gitअक्सर किसी समस्या को एक और flag जोड़कर "solve" करता है, लेकिन ज़्यादातर users को इन features की जानकारी ही नहीं होती। अगर defaults को ही बेहतर बनाया जाए, तो compatibility तोड़े बिना भी समस्या हल की जा सकती हैअगर repository के आकार का ज़्यादातर हिस्सा पुरानी revisions में है, तो
rsyncकी तरह पहले latest version लाने वाला तरीका अधिकांश users के लिए सबसे उपयुक्त समाधान हैGitcore में बड़ी files के support का आना बहुत खुशी की बात है। चाहे external solution हो, opt-in संरचना अंततः मिलती-जुलती ही रहती है। मेरा लक्ष्य commands को यथासंभव कम रखना और इसे seamless बनाना था, इसलिए API को.gitattributesfile केsmudge/cleanfilters तक सीमित रखकर design किया। साथ ही,AtlassianऔरMicrosoftके साथ सीधे काम करके vendor lock-in हटाने की कोशिश की, और file locking API मेंAtlassianसे काफ़ी मदद मिली।LFSको तीन hosts पर compatible support के साथ open source के रूप में दिया गया हैहम
gitयाgit-lfsमें आने वाली समस्याओं को हल करने के लिएoxenबना रहे हैं। यहgitinterface को ज्यों का त्यों follow करता है, लेकिन बड़ी files और लाखों files वाले monorepo environment में बहुत तेज़ चलता है। हम open sourceCLIऔर server देते हैं; दिलचस्पी हो तो feedback देंhttps://github.com/Oxen-AI/Oxen
gitकी storage पद्धति को भीresticयाborgजैसे आधुनिक backup tools की तरह files और directories की content-defined chunking पर आधारित तरीके से overhaul करने की ज़रूरत हैGitLFSकी कमियों में authentication issue छूट गया है। अगरSSH-agentइस्तेमाल न करें, तो एकpushके दौरान भी कई बार authentication से गुजरना पड़ता है। मेरे अनुभव में कभी-कभी दो या तीन बार से भी ज़्यादा करना पड़ा है