git गिट संस्करण नियंत्रण प्रणाली का उपयोग कर बाइनरी फाइलों को लॉक करना




version-control binaryfiles (17)

TortoiseGit ऑफिस दस्तावेजों के लिए कार्यालय के दस्तावेजों के लिए पूर्ण गिट वर्कफ़्लो का समर्थन करता है। यह ओपन डॉक्यूमेंट प्रारूपों के लिए ओपनऑफिस को भी प्रतिनिधि करता है।

https://code.i-harness.com

साढ़े सालों से, मैं एसवीएन से स्विच को दूर करने की उम्मीद में गिट समुदाय पर अपनी आंखें रख रहा हूं। मुझे वापस रखने वाला एक विशेष मुद्दा द्विआधारी फाइलों को लॉक करने में असमर्थता है। पिछले साल मैंने अभी तक इस मुद्दे पर विकास को देखना नहीं है। मैं समझता हूं कि लॉकिंग फाइलें वितरित स्रोत नियंत्रण के मौलिक सिद्धांतों के खिलाफ जाती हैं, लेकिन मुझे नहीं लगता कि वेब विकास कंपनी बाइटरी फ़ाइल विवादों की संभावना होने पर स्रोत कोड और छवि फ़ाइल परिवर्तनों को ट्रैक करने के लिए गिट का लाभ कैसे ले सकती है।

लॉकिंग के प्रभावों को प्राप्त करने के लिए, एक "केंद्रीय" भंडार की पहचान की जानी चाहिए। गिट की वितरित प्रकृति के बावजूद, अधिकांश कंपनियों के पास एक सॉफ्टवेयर प्रोजेक्ट के लिए "केंद्रीय" भंडार होगा। हमें किसी निर्दिष्ट पते पर शासी गिट भंडार से लॉक की आवश्यकता के रूप में फ़ाइल को चिह्नित करने में सक्षम होना चाहिए। शायद यह मुश्किल हो गया है क्योंकि गिट फाइल सामग्री को फाइल नहीं करता है?

क्या आप में से कोई भी गिट और बाइनरी फाइलों से निपटने में अनुभव करता है जिसे संशोधन से पहले लॉक किया जाना चाहिए?

नोट: ऐसा लगता है कि स्रोत गियर के नए ओपन सोर्स वितरित संस्करण नियंत्रण प्रोजेक्ट, वेरिएसिटी ने अपने लक्ष्यों में से एक के रूप में लॉक कर दिया है।


कैड फाइलों के बारे में क्या? अगर फ़ाइलों को लॉक नहीं किया जाता है, तो केवल पढ़ने के लिए ही रखा जा सकता है, अधिकांश कैड प्रोग्राम उन्हें किसी भी वीसीएस द्वारा नई फाइल के रूप में देखा जाने वाला मनमाने ढंग से बिट्स को बदल देगा। तो मेरे विचार में, लॉकिंग कुछ पार्टिकल फाइल बदलने के आपके इरादे को संचारित करने का एक आदर्श माध्यम है। साथ ही, यह कुछ सॉफ्टवेयर को पहले स्थान पर लेखन पहुंच प्राप्त करने से रोकता है। यह सॉफ़्टवेयर को बंद करने या कम से कम सभी फ़ाइलों को पूरी तरह से बंद करने की आवश्यकता के बिना स्थानीय फ़ाइलों के अपडेट की अनुमति देता है।


गिट एक गैर-टीम वातावरण में बहुत अच्छी तरह से काम करेगा जहां प्रत्येक डेवलपर पूरी तरह से कोड या फ़ाइल के टुकड़े के लिए ज़िम्मेदार है, क्योंकि उस मामले में ताले के बारे में संचार की आवश्यकता नहीं है।

अगर आपके संगठन को टीम पर्यावरण की आवश्यकता होती है (आमतौर पर नौकरी सुरक्षा से डेवलपर्स को पट्टी करने के लिए), तो svn का उपयोग करें, गिट आपके लिए नहीं है। एसवीएन डेवलपर्स के बीच ताले के बारे में दोनों स्रोत नियंत्रण और संचार प्रदान करता है।


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


जब मैं सबवर्सन का उपयोग कर रहा था, तो मैंने धार्मिक रूप से svn:needs-lock सेट किया svn:needs-lock सभी बाइनरी और यहां तक ​​कि हार्ड-टू-एडिट टेक्स्ट फ़ाइलों पर svn:needs-lock संपत्ति। मैंने कभी भी किसी भी संघर्ष का अनुभव नहीं किया।

अब, गिट में, मुझे ऐसी चीजों के बारे में चिंता नहीं है। याद रखें: सबवर्सन में ताले वास्तव में अनिवार्य ताले नहीं हैं, वे केवल संचार उपकरण हैं। और अनुमान लगाएं: मुझे संवाद करने के लिए सबवर्जन की आवश्यकता नहीं है, मैं ई-मेल, फोन और आईएम के साथ ठीक प्रबंधन कर सकता हूं।

एक और चीज मैंने किया है, सादे पाठ प्रारूपों के साथ कई बाइनरी प्रारूपों को प्रतिस्थापित करना है। मैं Word के बजाय पुन: संरचित पाठ या LaΤ Ε Χ का उपयोग करता हूं, एक्सेल के बजाय सीएसवी, विज़िओ के बजाय ASCII-Art, डेटाबेस के बजाय वाईएएमएल, ओओ ड्रा के बजाय एसवीजी, एमआईडीआई के बजाय एबीसी, और इसी तरह।


बस उस फ़ाइल के साथ सीसी में एक टेक्स्ट फ़ाइल डालें जिसे आप लॉक करना चाहते हैं और फिर अपडेट हुक इसे अस्वीकार कर दें।


बाइनरी पर कई स्थानों पर होने वाले परिवर्तनों के साथ मारियो की अतिरिक्त चिंता के जवाब में। तो परिदृश्य एलिस और बॉब दोनों एक ही समय में एक ही बाइनरी संसाधन में परिवर्तन कर रहे हैं। उनमें से प्रत्येक का अपना स्थानीय रेपो होता है, जो एक केंद्रीय रिमोट से क्लोन किया जाता है।

यह वास्तव में एक संभावित समस्या है। तो ऐलिस पहले खत्म होता है और केंद्रीय एलिस alice/update शाखा में जाता है। आम तौर पर जब ऐसा होता है, ऐलिस एक घोषणा करेगा कि इसकी समीक्षा की जानी चाहिए। बॉब इसे देखता है और इसकी समीक्षा करता है। वह या तो (1) उन परिवर्तनों को स्वयं अपने संस्करण में शामिल कर सकता है ( alice/update से alice/update और उसमें अपना परिवर्तन करना) या (2) bob/update अपने स्वयं के परिवर्तन प्रकाशित कर सकते हैं। फिर, वह एक घोषणा करता है।

अब, यदि एलिस इसके बजाय master को धक्का देती है, तो बॉब को एक दुविधा होती है जब वह master खींचता है और अपनी स्थानीय शाखा में विलय करने की कोशिश करता है। एलिस के साथ उनके संघर्ष। लेकिन फिर, एक ही प्रक्रिया लागू हो सकती है, बस विभिन्न शाखाओं पर। और यहां तक ​​कि यदि बॉब सभी चेतावनियों को अनदेखा करता है और एलिस के ऊपर काम करता है, तो चीजों को ठीक करने के लिए ऐलिस की प्रतिबद्धता को खींचना हमेशा संभव होता है। यह बस एक संचार मुद्दा बन जाता है।

चूंकि (AFAIK) सबवर्जन ताले सिर्फ सलाहकार हैं, एक ई-मेल या तत्काल संदेश एक ही उद्देश्य की सेवा कर सकता है। लेकिन अगर आप ऐसा नहीं करते हैं, तो गिट आपको इसे ठीक करने देता है।

नहीं, प्रति लॉकिंग तंत्र नहीं है। लेकिन लॉकिंग तंत्र सिर्फ अच्छे संचार के लिए एक विकल्प बनता है। मेरा मानना ​​है कि यही कारण है कि गिट डेवलपर्स ने लॉकिंग तंत्र नहीं जोड़ा है।


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


मैं फ़ाइल-लॉकिंग को गिट में एक फीचर के रूप में कभी भी बनाने की उम्मीद नहीं करता। आप किस प्रकार की बाइनरी फाइलों में मुख्य रूप से रूचि रखते हैं? क्या आप वास्तव में फ़ाइलों को लॉक करने में रुचि रखते हैं, या केवल उन विलयों को रोकने में रुचि रखते हैं जो उन्हें विलय करने में सक्षम नहीं हैं।

मुझे लगता है कि गिट में ओपनऑफिस-दस्तावेज़ों को विलय करने के लिए किसी को बात करने (या यहां तक ​​कि कार्यान्वित करने) का समर्थन करने की याद आती है।


मैं मानता हूं कि बाइनरी फाइलों को लॉक करना कुछ वातावरणों के लिए एक आवश्यक विशेषता है। मैंने अभी इस बारे में सोचा था कि इसे कैसे कार्यान्वित किया जाए, हालांकि:

  • फ़ाइल को "जरूरत-लॉक" के रूप में चिह्नित करने का एक तरीका है (जैसे "svn: need-lock" प्रॉपर्टी)।
  • चेकआउट पर, गिट ऐसी फ़ाइल को केवल पढ़ने के लिए चिह्नित करेगा।
  • एक नया कमांड git-lock लॉक करने की अनुमति मांगने के लिए कहीं भी चल रहे केंद्रीय लॉक सर्वर से संपर्क करेगा।
  • यदि लॉक सर्वर अनुमति देता है, तो फ़ाइल को पढ़ने-लिखने के लिए चिह्नित करें।
  • git-add लॉक फ़ाइल की सामग्री हैश के लॉक सर्वर को सूचित करेगा।
  • लॉक सर्वर उस सामग्री हैश को मास्टर रिपोजिटरी पर प्रतिबद्धता में दिखाई देने के लिए देखेगा।
  • जब हैश प्रकट होता है, तो लॉक जारी करें।

यह बहुत आधा बेक्ड विचार है और हर जगह संभावित छेद हैं। यह गिट की भावना के खिलाफ भी जाता है, फिर भी यह कुछ संदर्भों में निश्चित रूप से उपयोगी हो सकता है।

किसी विशेष संगठन के भीतर, इस तरह की चीज शायद स्क्रिप्ट रैपर के उपयुक्त संयोजन का उपयोग करके बनाई जा सकती है और हुक प्रतिबद्ध कर सकती है।


मैंने गिट चर्चा समूहों पर इस मुद्दे पर चर्चा की है और निष्कर्ष निकाला है कि इस समय, गिट के लिए केंद्रीकृत फ़ाइल लॉकिंग की विधि पर कोई सहमति नहीं है


यह देखने के लिए कि क्या लॉकिंग छवियां वास्तव में आवश्यक हैं, अपने वर्तमान वर्कफ़्लो की जांच करना उचित है। दो लोगों के लिए स्वतंत्र रूप से एक छवि को संपादित करना अपेक्षाकृत असामान्य है, और थोड़ा सा संचार लंबा सफर तय कर सकता है।


यह सच हो सकता है कि एक परियोजना को पुनर्गठित करने से ताले से बचने में मदद मिल सकती है, लेकिन:

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

अनुरोध करने के लिए, कि एक पूरी कंपनी अपने वर्कफ़्लो को पुनर्गठित कर सकती है और बाइनरी उत्पन्न करने वाले सभी उपकरणों को प्रतिस्थापित कर सकती है, केवल ताले की कमी के कारण, गिट के साथ काम करने में सक्षम होने के लिए, काफी अक्षम होती है।

ताले गिट दर्शन (जो बाइनरी के लिए कभी नहीं बनाया गया था) में फिट नहीं होते हैं, लेकिन गैर-उपेक्षित स्थितियां हैं, जहां ताले ऐसी समस्या को हल करने का सबसे प्रभावी तरीका हैं।


यह समाधान नहीं है बल्कि लॉकिंग तंत्र की आवश्यकता क्यों है इस पर एक टिप्पणी है। कुछ ऐसे क्षेत्रों में उपयोग किए जाने वाले कुछ उपकरण हैं जो बाइनरी केवल प्रारूपों का उपयोग करते हैं जो कि महत्वपूर्ण बाहर मिशन हैं और "बेहतर / अलग-अलग औजारों का उपयोग करें" सिर्फ एक विकल्प नहीं है। कोई व्यावहारिक वैकल्पिक उपकरण नहीं हैं। जिनके साथ मैं वास्तव में परिचित हूं, वे विलय के लिए उम्मीदवार नहीं होंगे, भले ही आपने एक ही जानकारी को एएससीआई प्रारूप में संग्रहीत किया हो। मैंने सुना है कि एक आपत्ति है कि आप ऑफ़लाइन काम करने में सक्षम होना चाहते हैं। विशेष उपकरण जो मैं सोच रहा हूं वास्तव में लाइसेंस खींचने की आवश्यकता के कारण ऑफ़लाइन काम नहीं करता है, इसलिए यदि मेरे पास लैपटॉप पर डेटा है तो ऐसा नहीं है कि मैं किसी भी ट्रेन पर उपकरण चला सकता हूं। उस ने कहा, अगर मेरे पास धीमी कनेक्शन है तो क्या गिट प्रदान करता है, मैं लाइसेंस प्राप्त कर सकता हूं और परिवर्तन भी खींच सकता हूं लेकिन विभिन्न संस्करणों को देखने के लिए तेज़ स्थानीय प्रतिलिपि रख सकता हूं। यह एक अच्छी बात है कि डीवीसीएस आपको इस मामले में भी देता है।

एक दृश्य बिंदु यह है कि गिट बस उपयोग करने का साधन नहीं है, लेकिन यह सभी टेक्स्ट फ़ाइलों के लिए अच्छा है जो इसके साथ भी प्रबंधित होते हैं और विभिन्न फ़ाइलों के लिए अलग-अलग संस्करण नियंत्रण उपकरण की आवश्यकता होती है।

सॉर्ट-ऑफ-एडवाइजरी-लॉकिंग-थ्रू-मेल दृष्टिकोण वास्तव में बदबू आ रही है। मैंने इसे देखा है और "मैं इसे संपादित कर रहा हूं" के ईमेल की अंतहीन धारा से थक गया हूं "मैंने संपादन किया है" और इसके कारण परिवर्तन खो गए। मैं जिस विशेष मामले के बारे में सोच रहा हूं वह वह था जहां छोटी एसीआईआई फाइलों का संग्रह बहुत अच्छा था लेकिन यह एक तरफ है।


हमने हाल ही में गिट (पहले इस्तेमाल किए गए सबवर्जन) का उपयोग करना शुरू कर दिया है और मुझे वर्कफ़्लो में बदलाव मिला है जो ताले की आवश्यकता के बिना आपकी समस्या में मदद कर सकता है। यह लाभ उठाता है कि गिट कैसे डिज़ाइन किया गया है और शाखाएं कितनी आसान हैं।

असल में, यह एक गैर-मास्टर शाखा को धक्का देने, उस शाखा की समीक्षा करने, और फिर मास्टर शाखा (या जो भी लक्ष्य शाखा है) में विलय करने के लिए उबलता है।

जिस तरह से गिट का उपयोग "इरादा" किया जाता है, प्रत्येक डेवलपर अपनी सार्वजनिक भंडार प्रकाशित करता है, जिसे वे दूसरों से खींचने का अनुरोध करते हैं। मैंने पाया है कि सबवर्जन उपयोगकर्ताओं को इसके साथ परेशानी है। इसलिए, इसके बजाय, हम केंद्रीय भंडार में शाखाओं के पेड़ को धक्का देते हैं, प्रत्येक उपयोगकर्ता के पास अपना स्वयं का शाखा पेड़ होता है। उदाहरण के लिए, इस तरह का पदानुक्रम काम कर सकता है:

users/a/feature1
users/a/feature2
users/b/feature3
teams/d/featurey

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

फिर उपयोगकर्ता के लिए एक स्थानीय रेपो में एक:

feature1
feature2

और इसे केंद्रीय सर्वर (मूल) में लाने के लिए:

git push origin feature1:users/a/feature1

(यह शायद कॉन्फ़िगरेशन परिवर्तनों के साथ सरलीकृत किया जा सकता है)

वैसे भी, एक बार फीचर 1 की समीक्षा की जाती है, जो भी जिम्मेदार होता है (हमारे मामले में, यह सुविधा का डेवलपर है, आप एक भी उपयोगकर्ता को मास्टर के लिए विलय के लिए जिम्मेदार हो सकता है), निम्न कार्य करता है:

git checkout master
git pull
git merge users/name/feature1
git push

पुल एक fetch (किसी भी नए मास्टर परिवर्तन और फीचर शाखा खींच रहा है) और केंद्रीय भंडार क्या है के लिए अद्यतन मास्टर। यदि उपयोगकर्ता ने अपना काम किया और सही तरीके से मास्टर को ट्रैक किया, तो विलय के साथ कोई समस्या नहीं होनी चाहिए।

इसका मतलब यह है कि, यदि कोई उपयोगकर्ता या दूरस्थ टीम बाइनरी संसाधन में बदलाव करता है, तो यह मास्टर शाखा में शामिल होने से पहले समीक्षा की जाती है। और जब मास्टर शाखा में कुछ जाता है तो एक स्पष्ट चित्रण (प्रक्रिया के आधार पर) होता है।

आप गिट हुक का उपयोग करके प्रोग्राम के व्यावहारिक रूप से इसके पहलुओं को भी लागू कर सकते हैं, लेकिन फिर से, मैंने अभी तक इनके साथ काम नहीं किया है, इसलिए उन पर बात नहीं कर सकते।


गिट एलएफएस 2.0 ने फ़ाइल लॉकिंग के लिए समर्थन जोड़ा है।

गिट एलएफएस 2.0.0 के साथ अब आप फ़ाइलों को लॉक कर सकते हैं जिन पर आप सक्रिय रूप से काम कर रहे हैं, दूसरों को गिट एलएफएस सर्वर पर धक्का देने से रोकते हैं जब तक आप फ़ाइलों को फिर से अनलॉक नहीं करते।

यह फाइल सिस्टम स्तर पर विलय विवादों के साथ-साथ गैर-विलय करने योग्य फ़ाइलों पर खोए गए काम को रोक देगा। हालांकि यह गिट की वितरित और समानांतर प्रकृति के विपरीत प्रतीत होता है, फाइल लॉकिंग कई सॉफ्टवेयर विकास वर्कफ़्लो का एक महत्वपूर्ण हिस्सा है-खासकर बाइनरी संपत्तियों के साथ काम करने वाली बड़ी टीमों के लिए।


सबवर्जन में ताले हैं, और वे सिर्फ सलाह नहीं हैं। उन्हें svn:needs-lock का उपयोग करके लागू किया जा सकता है svn:needs-lock विशेषता (लेकिन यदि आवश्यक हो तो जानबूझकर टूटा जा सकता है)। गैर-विलय करने योग्य फ़ाइलों के प्रबंधन के लिए यह सही समाधान है। कंपनी मैं सबवर्सन में बस सब कुछ के बारे में स्टोर के लिए काम करता हूं, और svn:needs-lock का उपयोग करता है svn:needs-lock सभी गैर-विलय करने योग्य फ़ाइलों के लिए svn:needs-lock

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

एक केंद्रीय लॉक सर्वर, जबकि डीवीसीएस के सिद्धांतों के खिलाफ, गैर-विलय करने योग्य फ़ाइलों के लिए एकमात्र व्यवहार्य विधि है। जब तक डीवीसीएस में केंद्रीय लॉक सुविधा नहीं है, मुझे लगता है कि यह उस कंपनी को रखेगा जो मैं सबवर्सन का उपयोग करने के लिए काम करता हूं।

बेहतर समाधान आपके सभी बाइनरी फ़ाइल प्रारूपों के लिए मर्ज टूल बनाना होगा, लेकिन यह एक दीर्घकालिक और चालू लक्ष्य है जो कभी भी "समाप्त" नहीं होगा।

यहां विषय पर एक दिलचस्प पढ़ा गया है।





dvcs