• version control system की आंतरिक संरचना को समझने के लिए Git जैसा एक सिस्टम खुद इम्प्लीमेंट किया गया
  • Git के SHA-1 और zlib की जगह SHA-256 hash और zstd compression का उपयोग किया गया, और repository को .tvc directory structure में संगठित किया गया
  • यह Rust में लिखा गया है, और file hash·compression·commit·checkout फीचर्स को चरणबद्ध तरीके से इम्प्लीमेंट किया गया
  • commit object में tree hash, parent commit, author, message शामिल हैं, और एक ही फ़ाइल का hash समान होने पर उसे दोबारा स्टोर नहीं किया जाता
  • Git के content-addressed file store होने को सीधे अनुभव करते हुए, structured data format के महत्व पर ज़ोर दिया गया

hashing और compression का तरीका

  • Git सभी objects को SHA-1 hash से पहचानता है, लेकिन इस प्रोजेक्ट में SHA-256 का उपयोग किया गया
    • SHA-1 पुराना है और सुरक्षा की दृष्टि से कमज़ोर है, लेकिन इस प्रोजेक्ट में इसका उपयोग सिर्फ़ फ़ाइल सामग्री की पहचान के लिए था, इसलिए security महत्वपूर्ण नहीं थी
  • Git के zlib की जगह Facebook की zstd compression library अपनाई गई
    • zstd को अधिक efficient माना गया, और Git compatibility इस प्रोजेक्ट का लक्ष्य नहीं था
  • प्रोजेक्ट का नाम “tvc (Tony’s Version Control)” है, और .tvc तथा .tvcignore फ़ाइलें Git की संबंधित संरचनाओं के रूप में उपयोग की गईं

इम्प्लीमेंटेशन के चरण

  • इम्प्लीमेंटेशन का क्रम command arguments पढ़ना → ignore rules पढ़ना → file list दिखाना → hash और compression → tree·commit बनाना → HEAD management → commit checkout था
  • यह Rust में लिखा गया है, और ls command .tvcignore rules लागू करके non-ignored files को recursively खोजता है और हर फ़ाइल का SHA-256 hash दिखाता है
  • zstd library का उपयोग करके file compression और decompression फीचर को सरल रूप से इम्प्लीमेंट किया गया

commit की संरचना

  • commit object में निम्न जानकारी शामिल होती है
    1. object type (commit)
    2. उस समय की file system state (tree hash)
    3. पिछला commit (HEAD)
    4. author
    5. commit message
  • Git के विपरीत author और committer के बीच का अंतर नहीं रखा गया, और merge या rebase जैसी सुविधाएँ इम्प्लीमेंट नहीं की गईं
  • commit बनाते समय tree object बनाया, hash किया, compress किया और .tvc/objects/ में स्टोर किया जाता है, फिर HEAD फ़ाइल अपडेट की जाती है
  • समान hash वाली एक ही फ़ाइल को दोबारा स्टोर नहीं किया जाता, जिससे duplicate storage रोकना संभव होता है

tree object और checkout

  • generate_tree() function directories को traverse करते हुए हर फ़ाइल को hash, compress और store करता है, और filename तथा hash को string के रूप में व्यवस्थित करता है
    • subdirectories को recursive तरीके से प्रोसेस करके tree structure बनाया जाता है
  • commit और tree objects को structs (Commit, Tree) के रूप में parse किया गया ताकि उन्हें memory में आसानी से संभाला जा सके
  • generate_fs() function tree structure के आधार पर file system को फिर से बनाता है और दिए गए path पर checkout करता है

प्रोजेक्ट से मिली सीख

  • Git वास्तव में एक content-addressed (key-value) file store है, इसे सीधे अनुभव किया गया
  • सबसे कठिन हिस्सा object format parsing था, और अगली बार YAML या JSON जैसे अधिक स्पष्ट format का उपयोग करने की योजना है
  • पूरा कोड GitHub repository(tonystr/t-version-control) में प्रकाशित है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.