फ़ाइलों को डुप्लिकेट किए बिना कुशल वर्शन कंट्रोल बनाना

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

अपने LaTeX Writer प्रोजेक्ट को बनाते समय मुझे इस समस्या का सामना करना पड़ा। मुझे उच्च स्टोरेज लागत के बिना वर्शन कंट्रोल और प्रोजेक्ट फोर्किंग को संभालने के तरीके की आवश्यकता थी।

मैंने देखा कि GitHub कैसे काम करता है। GitHub हर बार बदलाव करने पर पूरा रिपॉजिटरी (repository) स्टोर नहीं करता है। यह कंटेंट को अलग से स्टोर करता है और फ़ाइलों तथा कमिट्स (commits) को लिंक करने के लिए रेफरेंस का उपयोग करता है।

मैंने तीन मुख्य घटकों का उपयोग करके अपना सिस्टम बनाया:

  • Metadata: यह प्रोजेक्ट्स, ओनर्स और फोल्डर्स के लिए ID स्टोर करता है।
  • File Records: ये फ़ाइल के नाम और कंटेंट के लिंक स्टोर करते हैं।
  • Blobs: यहाँ वास्तविक कंटेंट रहता है।

यह सिस्टम कंटेंट हैशिंग (content hashing) के माध्यम से काम करता है। जब आप एक फ़ाइल सेव करते हैं, तो सिस्टम कंटेंट के आधार पर एक यूनिक ID जेनरेट करता है। यदि वह कंटेंट पहले से मौजूद है, तो सिस्टम मौजूदा Blob का ही पुन: उपयोग करता है। यह नया Blob नहीं बनाता है।

यह दृष्टिकोण फोर्किंग को आसान और सस्ता बनाता है। जब आप किसी प्रोजेक्ट को फोर्क करते हैं:

  • सिस्टम एक नई Project ID बनाता है।
  • यह फ़ाइलों और फोल्डर्स के लिए नया मेटाडेटा बनाता है।
  • यह नए मेटाडेटा को मौजूदा Blobs की ओर पॉइंट करता है।

फोर्क के दौरान कोई वास्तविक फ़ाइल कंटेंट कॉपी नहीं किया जाता है। आप केवल छोटे मेटाडेटा रिकॉर्ड्स को डुप्लिकेट करते हैं।

जब आप किसी फोर्क को एडिट करते हैं, तो प्रक्रिया कुशल बनी रहती है:

  • आप कंटेंट बदलते हैं।
  • सिस्टम नए कंटेंट को हैश करता है।
  • यह नया Blob तभी बनाता है जब वह सटीक कंटेंट मौजूद न हो।
  • आपके फोर्क का मेटाडेटा नए Blob की ओर पॉइंट करता है।
  • मूल प्रोजेक्ट अभी भी पुराने Blob की ओर पॉइंट करता है।

यह तरीका कई लाभ प्रदान करता है:

  • कंटेंट डीडुप्लिकेशन (deduplication) से भारी मात्रा में जगह बचती है।
  • फोर्किंग तुरंत हो जाती है।
  • वर्शन मैनेजमेंट व्यवस्थित रहता है।
  • डेटाबेस की वृद्धि धीमी रहती है।

आपको भारी स्टोरेज ओवरहेड के बिना GitHub जैसी कार्यक्षमता मिलती है।

स्रोत: https://dev.to/prashant_patil_49/building-github-inspired-version-control-and-forking-without-duplicating-project-files-5aap