यहाँ मुझे git के बारे में पसंद नहीं है:
सबसे पहले, मुझे लगता है कि वितरित विचार वास्तविकता के सामने उड़ जाता है। हर कोई जो वास्तव में गिट का उपयोग कर रहा है, वह केंद्रीकृत तरीके से कर रहा है, यहां तक कि लिनस टॉर्वाल्ड्स भी। यदि कर्नेल को वितरित तरीके से प्रबंधित किया गया था, तो इसका मतलब है कि मैं वास्तव में "आधिकारिक" कर्नेल स्रोतों को डाउनलोड नहीं कर सकता हूं - एक नहीं होगा - मुझे यह तय करना होगा कि मुझे लिनुस का संस्करण चाहिए, या जो का संस्करण, या बिल का संस्करण। यह स्पष्ट रूप से हास्यास्पद होगा, और यही कारण है कि एक आधिकारिक परिभाषा है जो लाइनस एक केंद्रीकृत वर्कफ़्लो का उपयोग करके नियंत्रित करती है।
यदि आप स्वीकार करते हैं कि आप अपने सामान की एक केंद्रीकृत परिभाषा चाहते हैं, तो यह स्पष्ट हो जाता है कि सर्वर और क्लाइंट भूमिका पूरी तरह से अलग हैं, इसलिए हठधर्मिता कि क्लाइंट और सर्वर सॉफ्टवेयर्स समान होना चाहिए, विशुद्ध रूप से सीमित हो जाता है। हठधर्मिता कि क्लाइंट और सर्वर डेटा समान रूप से हास्यास्पद होना चाहिए, विशेष रूप से कोडबेस में, जो पंद्रह वर्षों के इतिहास में मिला है, जिसके बारे में कोई भी परवाह नहीं करता है, लेकिन हर किसी को क्लोन करना होगा।
हम वास्तव में उस सभी पुराने सामान के साथ क्या करना चाहते हैं, इसे एक अलमारी में रखा जाता है और यह भूल जाते हैं कि यह वहीं है, जैसे कोई सामान्य वीसीएस करता है। तथ्य यह है कि यह सब हर दिन नेटवर्क पर आगे पीछे हिलता है बहुत खतरनाक है, क्योंकि यह आपको इसे चुभाने के लिए नग करता है। उस छंटाई में बहुत सारे थकाऊ फैसले शामिल हैं और यह गलत हो सकता है। तो लोग शायद इतिहास में विभिन्न बिंदुओं से स्नैपशॉट रिपोज की एक पूरी श्रृंखला रखेंगे, लेकिन क्या ऐसा नहीं था कि पहली बार किस स्रोत का नियंत्रण था? यह समस्या तब तक मौजूद नहीं थी जब तक कि किसी ने वितरित मॉडल का आविष्कार नहीं किया।
Git सक्रिय रूप से लोगों को इतिहास को फिर से लिखने के लिए प्रोत्साहित करता है, और उपरोक्त शायद इसका एक कारण है। हर सामान्य वीसीएस इतिहास को सभी के लिए असंभव बना देता है, लेकिन यह सुनिश्चित करता है कि प्रवेशकर्ताओं के पास इस पर विचार करने का कोई कारण नहीं है। अगर मैं गलत हूं तो मुझे सुधारें, लेकिन जहां तक मुझे पता है, git सामान्य उपयोगकर्ताओं को एक्सेस लिखने के लिए कोई रास्ता नहीं देता है, लेकिन उन्हें इतिहास लिखने से प्रतिबंधित कर देता है। इसका मतलब है कि कोई भी विकासकर्ता जिसके पास ग्रज (या जो अभी भी सीखने की अवस्था से जूझ रहा है) पूरे कोडबेस को मिटा सकता है। हम उस एक को कैसे कसेंगे? ठीक है, या तो आप पूरे इतिहास का नियमित बैकअप बनाते हैं, यानी आप इतिहास को चुकता रखते हैं, या आप कुछ गरीबों को छोड़कर सभी को लिखने पर प्रतिबंध लगाते हैं, जो ईमेल द्वारा सभी भिन्नताओं को प्राप्त करेंगे और उन्हें हाथ से मर्ज करेंगे।
आइए एक अच्छी तरह से वित्त पोषित, बड़ी परियोजना का एक उदाहरण लें और देखें कि उनके लिए कैसे काम कर रहा है: Android। मैंने एक बार खुद एंड्रॉइड सिस्टम के साथ एक नाटक करने का फैसला किया। मुझे पता चला कि मैं लिपियों के एक समूह का उपयोग करने वाला था जिसे रेपो कहा जाता है। रेपो के कुछ क्लाइंट पर और कुछ सर्वर पर चलते हैं, लेकिन दोनों ही, अपने अस्तित्व से, इस तथ्य को स्पष्ट कर रहे हैं कि दोनों में से कोई भी क्षमता अधूरी है। क्या हुआ कि मैं लगभग एक सप्ताह तक स्रोतों को खींचने में असमर्थ था और फिर पूरी तरह से छोड़ दिया। मुझे कई अलग-अलग रिपॉजिटरी से वास्तव में बड़ी मात्रा में डेटा खींचना होगा, लेकिन सर्वर मुझ जैसे लोगों से पूरी तरह से भरा हुआ था। रेपो का समय समाप्त हो रहा था और वह फिर से शुरू नहीं कर पा रहा था जहां से यह समय समाप्त हो गया था। अगर git इतना अधिक वितरण योग्य है, तो आपने सोचा होगा कि वे ' d ने उस एक सर्वर पर लोड को राहत देने के लिए किसी तरह की पीयर-टू-पीयर चीज की है। Git वितरण योग्य है, लेकिन यह एक सर्वर नहीं है। Git + रेपो एक सर्वर है, लेकिन रेपो डिस्ट्रिब्यूटेबल कॉस नहीं है, यह सिर्फ हैक्स का एड-हॉक कलेक्शन है।
गिट की अपर्याप्तता का एक समान उदाहरण है जिलेटाइट (और इसके पूर्वज जो जाहिरा तौर पर इतनी अच्छी तरह से काम नहीं करते थे।) जीटोलिट एक गिट सर्वर की तैनाती को आसान बनाने के रूप में अपनी नौकरी का वर्णन करता है। फिर से, इस चीज़ का अस्तित्व यह साबित करता है कि git कोई सर्वर नहीं है, इससे अधिक कोई क्लाइंट है। क्या अधिक है, यह कभी नहीं होगा, क्योंकि अगर यह या तो बड़े हो गए तो यह विश्वास करने वाला सिद्धांत होगा।
यदि आप वितरित वस्तु पर विश्वास करते हैं, तब भी गिट एक गड़बड़ होगा। उदाहरण के लिए, एक शाखा क्या है? वे कहते हैं कि आप हर बार जब आप एक रिपॉजिटरी को क्लोन करते हैं, तो आप एक शाखा बनाते हैं, लेकिन यह एक एकल रिपॉजिटरी में एक शाखा के समान नहीं हो सकती है। इसलिए कम से कम दो अलग-अलग चीजों को शाखाओं के रूप में संदर्भित किया जा रहा है। लेकिन फिर, आप एक रेपो में रिवाइंड भी कर सकते हैं और बस संपादन शुरू कर सकते हैं। क्या यह दूसरी तरह की शाखा है, या फिर कुछ अलग है? शायद यह निर्भर करता है कि आपको किस प्रकार का रेपो मिला है - ओह हां - जाहिर है कि रेपो बहुत स्पष्ट अवधारणा भी नहीं है। सामान्य हैं और नंगे हैं। आप एक सामान्य को धक्का नहीं दे सकते क्योंकि नंगे भाग अपने स्रोत पेड़ के साथ सिंक से बाहर निकल सकते हैं। लेकिन आप एक नंगे एक कॉस पर cvsimport नहीं कर सकते हैं जो उन्होंने ऐसा नहीं सोचा था। तो आप एक सामान्य करने के लिए cvsimport है, क्लोन करने के लिए कि एक नंगे जो डेवलपर्स को मारा, और cvsexport कि एक cv काम कर रहे प्रतिलिपि करने के लिए जो अभी भी cvs में जाँच की जानी है। किसको परेशान किया जा सकता है? ये सारी जटिलताएँ कहाँ से आईं? वितरित विचार से ही। मैंने अंत में गिटोलिट खाई क्योंकि यह मुझ पर इन प्रतिबंधों के और भी अधिक लगा रहा था।
गिट कहते हैं कि ब्रांचिंग हल्की होनी चाहिए, लेकिन कई कंपनियों के पास पहले से ही एक गंभीर दुष्ट शाखा की समस्या है, इसलिए मैंने सोचा होगा कि ब्रांचिंग सख्त पुलिसिंग के साथ एक महत्वपूर्ण निर्णय होना चाहिए। यह वह जगह है जहाँ वास्तव में चमकता है ...
परिलब्धियों में आपको शायद ही कभी शाखाओं की आवश्यकता होती है क्योंकि आप बहुत ही चुस्त तरीके से बदलावों को टाल सकते हैं। उदाहरण के लिए, सामान्य वर्कफ़्लो है कि आप मेनलाइन पर अंतिम ज्ञात अच्छे संस्करण से सिंक करते हैं, फिर अपनी सुविधा लिखें। जब भी आप किसी फ़ाइल को संशोधित करने का प्रयास करते हैं, तो उस फ़ाइल का अंतर आपके "डिफ़ॉल्ट बदलाव" में जुड़ जाता है। जब आप बदलाव में जांच करने का प्रयास करते हैं, तो यह स्वचालित रूप से समाचार को मेनलाइन से अपने बदलाव (प्रभावी रूप से इसे फिर से करना) में विलय करने की कोशिश करता है और फिर शुरू होता है। इस वर्कफ़्लो को आपके बिना भी समझने की आवश्यकता के बिना लागू किया जाता है। मेनलाइन इस प्रकार परिवर्तनों का इतिहास एकत्र करती है जिसे आप बाद में आसानी से अपना रास्ता चुन सकते हैं। उदाहरण के लिए, मान लीजिए कि आप एक पुराने को वापस लेना चाहते हैं, कहते हैं, पिछले एक से पहले वाला। आप आक्रामक परिवर्तन से पहले पल को सिंक करते हैं, प्रभावित फ़ाइलों को परिवर्तन के हिस्से के रूप में चिह्नित करते हैं, पल के बाद सिंक करें और "हमेशा मेरा" के साथ विलय करें। (वहाँ कुछ बहुत दिलचस्प था: सिंकिंग का मतलब एक ही बात नहीं है - अगर कोई फ़ाइल संपादन योग्य है (यानी एक सक्रिय बदलाव में) तो यह सिंक द्वारा क्लोब नहीं किया जाएगा लेकिन हल करने के कारण चिह्नित है।) अब आपके पास है। एक चेंजलिस्ट जो अपमानजनक एक को मिटा देता है। बाद की खबरों में विलय करें और आपके पास एक चेंजलिस्ट है जिसे आप वांछित प्रभाव डालने के लिए मेनलाइन के ऊपर रख सकते हैं। किसी भी बिंदु पर हमने किसी इतिहास को दोबारा नहीं लिखा। बाद की खबरों में विलय करें और आपके पास एक चेंजलिस्ट है जिसे आप वांछित प्रभाव डालने के लिए मेनलाइन के ऊपर रख सकते हैं। किसी भी बिंदु पर हमने किसी इतिहास को दोबारा नहीं लिखा। बाद की खबरों में विलय करें और आपके पास एक चेंजलिस्ट है जिसे आप वांछित प्रभाव डालने के लिए मेनलाइन के ऊपर रख सकते हैं। किसी भी बिंदु पर हमने किसी इतिहास को दोबारा नहीं लिखा।
अब, इस प्रक्रिया के माध्यम से आधे रास्ते को दबाते हुए, कोई व्यक्ति आपके पास भागता है और आपको सब कुछ छोड़ने और कुछ बग को ठीक करने के लिए कहता है। आप बस अपने डिफ़ॉल्ट चेंजलिस्ट को एक नाम (एक संख्या वास्तव में) देते हैं, फिर इसे "सस्पेंड" करते हैं, अब खाली डिफ़ॉल्ट चैनल में बग को ठीक करते हैं, इसे प्रतिबद्ध करते हैं, और नामित चैनल को फिर से शुरू करते हैं। यह एक समय में कई चेंजलगिस्ट को निलंबित करने के लिए विशिष्ट है, जहां आप विभिन्न चीजों को आज़माते हैं। यह आसान और निजी है। तुम क्या आप वास्तव में एक शाखा शासन से विलंब या चिकन से विलय करने के लिए प्रलोभन के बिना चाहते हैं।
मुझे लगता है कि यह सैद्धांतिक रूप से कुछ समान करने के लिए संभव होगा, लेकिन git व्यावहारिक रूप से कुछ भी संभव बनाता है बजाय एक वर्कफ़्लो के अनुमोदन से। केंद्रीकृत मॉडल वितरित मॉडल के सापेक्ष वैध सरलीकरण का एक गुच्छा है जो एक अमान्य सामान्यीकरण है। यह इतना बढ़ा हुआ है कि यह मूल रूप से इसके शीर्ष पर स्रोत नियंत्रण को लागू करने की अपेक्षा करता है, जैसा कि रेपो करता है।
दूसरी चीज प्रतिकृति है। Git में, कुछ भी संभव है इसलिए आपको इसे अपने लिए जानना होगा। पेरफोर्स में, आपको प्रभावी रूप से स्टेटलेस कैश मिलता है। केवल कॉन्फ़िगरेशन को यह जानना आवश्यक है कि मास्टर कहाँ है, और ग्राहक अपने विवेक पर मास्टर या कैश में से किसी पर भी इंगित कर सकते हैं। यह पाँच मिनट का काम है और यह गलत नहीं हो सकता।
आपको कोड समीक्षाएं, बुगज़िला संदर्भ इत्यादि की पुष्टि करने के लिए ट्रिगर और अनुकूलन योग्य रूप भी मिल गए हैं, और निश्चित रूप से, आपके पास शाखाएं हैं जब आपको वास्तव में उनकी आवश्यकता होती है। यह स्पष्ट नहीं है, लेकिन यह करीब है, और इसे स्थापित करना और बनाए रखना आसान है।
सब सब में, मुझे लगता है कि यदि आप जानते हैं कि आप एक केंद्रीकृत तरीके से काम करने जा रहे हैं, जो हर कोई करता है, तो आप एक उपकरण का उपयोग कर सकते हैं जो उस के साथ डिजाइन किया गया था। लिटस की डरावनी बुद्धि के साथ-साथ भेड़ की तरह चारों ओर एक-दूसरे का पालन करने की प्रवृत्ति के कारण गिट को ओवररेटेड किया गया है, लेकिन इसका मुख्य कारावास डेट्रे वास्तव में सामान्य ज्ञान के लिए खड़ा नहीं है, और इसका पालन करते हुए, गिट अपने हाथों से संबंध रखता है। दो विशाल हठधर्मियाँ (ए) सॉफ्टवेयर और (बी) डेटा दोनों क्लाइंट और सर्वर पर समान होना चाहिए, और यह हमेशा इसे जटिल बना देगा और केंद्रीकृत नौकरी में लंगड़ा होगा।