एक बेयर और नॉन-बेयर रिपॉजिटरी के बीच क्या अंतर है?


213

मैं Git में नंगे और गैर-नंगे / डिफ़ॉल्ट रिपोजिटर्स के बारे में पढ़ रहा हूं। मैं उनके बीच के अंतरों के बारे में अच्छी तरह से (सैद्धांतिक रूप से) समझ नहीं पाया हूं, और मुझे नंगे भंडार के लिए "धक्का" क्यों देना चाहिए। यहाँ सौदा है:

वर्तमान में, मैं केवल 3 अलग-अलग कंप्यूटरों पर एक परियोजना पर काम कर रहा हूं, लेकिन बाद में इसमें और अधिक लोग शामिल होंगे, इसलिए मैं संस्करण नियंत्रण के लिए Git का उपयोग कर रहा हूं। मैं सभी कंप्यूटरों पर नंगे रेपो को क्लोन करता हूं, और जब मैं उनमें से किसी एक पर अपने संशोधनों को पूरा करता हूं, तो मैं नंगे फोयो में बदलाव करता हूं। मैंने जो पढ़ा है, उसमें से नंगे रिपॉजिटरी में "वर्किंग ट्री" नहीं है, इसलिए अगर मैं नंगे रेपो का क्लोन बनाऊं, तो मेरे पास "वर्किंग ट्री" नहीं होगा।

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

फिर, मुझे नंगे भंडार का उपयोग क्यों करना चाहिए और क्यों नहीं करना चाहिए? व्यावहारिक अंतर क्या है? यह एक परियोजना पर काम करने वाले अधिक लोगों के लिए फायदेमंद नहीं होगा, मुझे लगता है।

इस तरह के काम के लिए आपके तरीके क्या हैं? सुझाव?


4
एयरोक्रॉस, आप एक गैर-नंगे भंडार (जो एक कार्यक्षेत्र है) बनाने के लिए एक नंगे भंडार पर क्लोन कर सकते हैं । तो, git cloneआप स्वतंत्र रूप से नंगे और गैर-नंगे भंडार के बीच का उपयोग कर सकते हैं।
डेरेक महार

13
@ एयरोक्रॉस: यह रूपांतरित करने के बारे में नहीं है; इससे कोई फर्क नहीं पड़ता कि दूसरे छोर पर क्या है। यदि आप दौड़ते हैं git clone --bareतो आपको एक नंगे रेपो मिलेगा, और यदि आप दौड़ते हैं git clone, तो आपको एक गैर-नंगे मिल जाएगा। हर सार्वजनिक परियोजना जिसे आपने कभी क्लोन किया है (उदाहरण के लिए, गीथूब पर होस्ट किया गया है) दूसरे छोर पर एक नंगे भंडार है।
Cascabel

1
Jefromi, मैं एयरोक्रॉस के बिंदु को सही कर रहा था, "इसलिए यदि मैं नंगे रेपो को क्लोन करता हूं, तो मेरे पास" वर्किंग ट्री "नहीं होगा", इसलिए यह एक तरह का रूपांतरण है। और हर सार्वजनिक परियोजना में एक नंगे भंडार नहीं होना चाहिए। यह सिर्फ विशिष्ट पसंद है क्योंकि एक नंगे भंडार अधिक कार्यकुशल है क्योंकि इसके पास कोई कार्यशील पेड़ नहीं है (यह किसी भी रिपोजिटरी के रूप में अंतरिक्ष कुशल है, जिसमें कोई कार्यशील पेड़ नहीं है, हालांकि)।
डेरेक महार

2
@ डेरेक: लेकिन मुद्दा यह है कि जैसे ही यह .IT निर्देशिका को पाता है, यह प्राप्त करना पूरी तरह से अनजान है कि रिमोट नंगे है या नहीं। यह रूपांतरित नहीं होता है। यह सिर्फ यह प्राप्त करता है कि इसे रिमोट से क्या चाहिए, और इसे वह जगह पर रखना चाहिए जहां इसे जाना चाहिए। कन्वर्ट करने के लिए कुछ भी नहीं है। यही मैं ओपी पर जोर देने की कोशिश कर रहा था। और मैं अच्छी तरह से जानता हूं कि सार्वजनिक परियोजनाओं को नंगे नहीं होना पड़ता है, लेकिन क्योंकि लोग बेवकूफ नहीं हैं, वे अनिवार्य रूप से सभी हैं। मुझे लगता है कि मैंने एक स्वीकार्य सामान्यीकरण किया।
कैस्केबेल

2
गैर-नंगे रिपॉजिटरी पर पुश देखें जो नंगे रिपॉजिटरी के उपयोग का एक और उत्कृष्ट विवरण देता है।
क्रेग मैकक्वीन

जवाबों:


95

एक नंगे और गैर-नंगे भंडार के बीच एक और अंतर यह है कि एक नंगे भंडार में एक डिफ़ॉल्ट रिमोट नहीं होता है मूल भंडार नहीं होता है:

~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
~/Projects$ cd bare
~/Projects/bare$ git branch -a
* master
~/Projects/bare$ cd ..
~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
~/Projects$ cd non-bare
~/Projects/non-bare$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

के लिए मैनुअल पेज से git clone --bare :

इसके अलावा रिमोट पर शाखा प्रमुखों को सीधे स्थानीय शाखा प्रमुखों को कॉपी किया जाता है, बिना मैप्स के उन्हें रीफ्स / रेमोट्स / मूल / के लिए मैप किया जाता है। जब इस विकल्प का उपयोग किया जाता है, तो न तो रिमोट-ट्रैकिंग शाखाएं और न ही संबंधित कॉन्फ़िगरेशन चर बनाए जाते हैं।

संभवतः, जब यह एक नंगे भंडार का निर्माण करता है, तो गिट यह मानता है कि नंगे भंडार कई दूरस्थ उपयोगकर्ताओं के लिए मूल भंडार के रूप में काम करेगा, इसलिए यह डिफ़ॉल्ट दूरस्थ मूल नहीं बनाता है। इसका मतलब यह है कि बुनियादी git pullऔर git pushसंचालन काम नहीं करेगा क्योंकि गिट कार्यक्षेत्र के बिना, आप नंगे भंडार में कोई भी बदलाव करने का इरादा नहीं रखते हैं:

~/Projects/bare$ git push
fatal: No destination configured to push to.
~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
~/Projects/bare$ 

1
हां, मैं मानता हूं कि यह नंगे और गैर-नंगे गिट रिपॉजिटरी के बीच का सबसे महत्वपूर्ण अंतर है। तथ्य यह है कि एक गैर-नंगे रिपॉजिटरी में एक कार्यक्षेत्र है, लेकिन एक नंगे रिपॉजिटरी में एक महत्वपूर्ण अंतर नहीं है, लेकिन git clone --no-checkoutबिना कार्यक्षेत्र फ़ाइलों के साथ एक गैर-नंगे भंडार भी बना सकता है।
डेरेक महार

10
गैर-नंगे रिपॉजिटरी में डिफ़ॉल्ट रिमोट "मूल" नहीं है, या तो।
मियादी

2
आप एक Git रिपॉजिटरी बस के साथ बना सकते हैं git init, जो एक गैर-नंगे रेपो बना देगा जिसमें कोई रिमोट निर्दिष्ट नहीं है।
मियादी

1
mipadi, यह सच है, लेकिन यह भी एक क्लोन नहीं है।
डेरेक महार

1
यह गलत है। यदि यह cloneएड किया गया है तो एक रिपॉजिटरी का डिफ़ॉल्ट मूल होगा । यदि इसे initस्थानीय स्तर पर एड किया गया है, तो इसकी ऐसी कोई उत्पत्ति नहीं होगी। इसका नंगेपन से कोई लेना-देना नहीं है।
नौफल इब्राहिम

62

एक नंगे और गैर-नंगे गिट रिपॉजिटरी के बीच का अंतर कृत्रिम और भ्रामक है क्योंकि एक कार्यक्षेत्र रिपॉजिटरी का हिस्सा नहीं है और एक रिपॉजिटरी को कार्यक्षेत्र की आवश्यकता नहीं है। कड़ाई से बोलते हुए, एक गिट रिपॉजिटरी में वे ऑब्जेक्ट शामिल होते हैं जो रिपॉजिटरी की स्थिति का वर्णन करते हैं। ये ऑब्जेक्ट किसी भी निर्देशिका में मौजूद हो सकते हैं, लेकिन आम तौर पर .gitकार्यक्षेत्र के शीर्ष-स्तरीय निर्देशिका में निर्देशिका में मौजूद होते हैं । कार्यक्षेत्र एक निर्देशिका ट्री है जो रिपॉजिटरी में एक विशेष प्रतिबद्ध का प्रतिनिधित्व करता है, लेकिन यह किसी भी निर्देशिका में मौजूद हो सकता है या बिल्कुल भी नहीं। वातावरण विविधता$GIT_DIR एक कार्यक्षेत्र को उस रिपॉजिटरी से जोड़ता है जहाँ से यह उत्पन्न होता है।

Git कमांड git cloneऔर git initदोनों विकल्प हैं --bareजो प्रारंभिक कार्यक्षेत्र के बिना रिपॉजिटरी बनाते हैं। ऐसा नहीं है कि Git कार्यक्षेत्र और भंडार की दो अलग-अलग है, लेकिन संबंधित अवधारणाओं इंगित और फिर भ्रमित शब्द का उपयोग करता दुर्भाग्यपूर्ण है नंगा दो विचारों को अलग करने के।


61

एक नंगे रिपॉजिटरी कुछ भी नहीं है। ईजीटी फ़ोल्डर ही यानी नंगे रिपॉजिटरी की सामग्री आपके स्थानीय वर्किंग रिपॉजिटरी के अंदर .it फ़ोल्डर की सामग्री के समान है।

  • एक दूरस्थ सर्वर पर नंगे रिपॉजिटरी का उपयोग करें ताकि कई योगदानकर्ताओं को अपने काम को आगे बढ़ाने की अनुमति मिल सके।
  • गैर-नंगे - जिस पर काम करने वाला पेड़ है वह आपकी परियोजना के प्रत्येक योगदानकर्ता की स्थानीय मशीन पर समझ में आता है।

60

5 साल बहुत देर से, मुझे पता है, लेकिन किसी ने वास्तव में इस सवाल का जवाब नहीं दिया:

फिर, मुझे नंगे भंडार का उपयोग क्यों करना चाहिए और क्यों नहीं करना चाहिए? व्यावहारिक अंतर क्या है? यह एक परियोजना पर काम करने वाले अधिक लोगों के लिए फायदेमंद नहीं होगा, मुझे लगता है।

इस तरह के काम के लिए आपके तरीके क्या हैं? सुझाव?

लोइलिगर / MCullough पुस्तक (978-1-449-31638-9, p196 / 7) से सीधे उद्धृत करने के लिए:

एक नंगे भंडार का उपयोग बहुत कम हो सकता है, लेकिन इसकी भूमिका महत्वपूर्ण है: सहयोगी विकास के लिए एक आधिकारिक केंद्र बिंदु के रूप में सेवा करना। अन्य डेवलपर्स cloneऔर fetchनंगे रिपॉजिटरी से और pushइसे अपडेट करने के लिए ... यदि आप एक रिपॉजिटरी सेट करते हैं जिसमें डेवलपर्स pushबदलते हैं, तो यह नंगे होना चाहिए। वास्तव में, यह अधिक सामान्य सर्वोत्तम अभ्यास का एक विशेष मामला है कि एक प्रकाशित भंडार नंगे होना चाहिए।


19

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


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

2
Mipadi, एक गैर-नंगे भंडार के पास एक चेक-आउट पेड़ नहीं हो सकता है। यह मामला है यदि आप एक गैर-नंगे भंडार के साथ बनाते हैं git clone --no-checkout। इस स्थिति में, गैर-नंगे रिपॉजिटरी के पास कार्यक्षेत्र के लिए एक स्थान है, लेकिन गिट उस कार्यक्षेत्र में किसी भी फाइल की जांच नहीं करता है।
डेरेक महार

17

एक नंगे भंडार में लाभ है

  • डिस्क उपयोग को कम किया
  • रिमोट पुश से संबंधित कम समस्याएं (क्योंकि कोई भी काम करने वाला पेड़ सिंक से बाहर निकलने या परस्पर विरोधी परिवर्तन नहीं होता है)

3
तो नंगे रिपॉजिटरी, उन लोगों के साथ काम करने का सबसे अच्छा / अनुशंसित तरीका है, जो कि THEIR रिपॉजिटरी की पहुंच तक नहीं हैं? (एसवीएन की तरह
किंदा

2
एयरोक्रॉस, मैं कहूंगा कि नंगे भंडार उस परिदृश्य के लिए एक अच्छा विकल्प है।
डेरेक महार

12

नंगे नंगे भंडार आपको (आपके काम करने वाले पेड़ में) नए कमिट बनाकर बदलावों को पकड़ने की अनुमति देते हैं।

अन्य रिपॉजिटरी से बदलावों को ट्रांसपोर्ट करके न केवल रिपोजिटरी को बदला जाता है।


10

मैं निश्चित रूप से Git "विशेषज्ञ" नहीं हूं। मैंने कुछ समय के लिए टॉरटॉइजगिट का उपयोग किया है, और आश्चर्य है कि जब यह मुझसे पूछा गया कि यह एक "नंगे" रेपो बनाना चाहता है तो मुझसे क्या बात हो रही है। मैं इस ट्यूटोरियल को पढ़ रहा था: https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init और यह मुद्दे को संबोधित करता है, लेकिन मैं अभी भी अवधारणा को नहीं समझ रहा था। इसने बहुत मदद की: http://bitflop.com/tutorials/git-bare-vs-non-bare-reposingories.html । अब, पहले वाला भी समझ में आता है!

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



9

एक डिफ़ॉल्ट / गैर-नंगे गिट रेपो में दो टुकड़े होते हैं:

  1. रिपॉजिटरी में सभी फाइलों का एक स्नैपशॉट (यह वह है जो "वर्किंग ट्री" का अर्थ गीट शब्दजाल में है)
  2. सभी फाइलों में किए गए सभी परिवर्तनों का एक इतिहास जो कभी भंडार में रहा है (इसमें गीट जार्गन का एक संक्षिप्त टुकड़ा नहीं लगता है जो इस सब को शामिल करता है)

स्नैपशॉट क्या आप शायद अपनी परियोजना के रूप में के बारे में सोच है: अपने कोड फ़ाइलें, निर्माण फ़ाइलें, सहायक लिपियों, और Git के साथ कुछ और आप संस्करण।

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

एक नंगे भंडार का मुख्य विचार यह है कि आपको वास्तव में स्नैपशॉट की आवश्यकता नहीं है। Git स्नैपशॉट को इधर-उधर रखता है क्योंकि यह मनुष्यों और अन्य गैर-Git प्रक्रियाओं के लिए सुविधाजनक है जो आपके कोड के साथ सहभागिता करना चाहते हैं, लेकिन स्नैपशॉट केवल राज्य को दोहरा रहा है जो इतिहास में पहले से ही है।

एक नंगे रिपॉजिटरी एक गिट रिपॉजिटरी है जिसमें स्नैपशॉट नहीं है। यह सिर्फ इतिहास को संग्रहीत करता है।

आप ऐसा क्यों चाहेंगे? ठीक है, यदि आप केवल Git (यानी आप अपनी फ़ाइलों को सीधे संपादित करने या उन्हें एक निष्पादन योग्य बनाने के लिए उपयोग करने के लिए नहीं जा रहे हैं) का उपयोग करके अपनी फ़ाइलों के साथ बातचीत करने जा रहे हैं, तो आप स्नैपशॉट के आसपास न रखकर अंतरिक्ष को बचा सकते हैं। विशेष रूप से, यदि आप किसी सर्वर पर अपने रेपो के केंद्रीकृत संस्करण को बनाए रख रहे हैं (यानी आप मूल रूप से अपने खुद के GitHub की मेजबानी कर रहे हैं), तो उस सर्वर में शायद एक नंगे रेपो होना चाहिए (आप अभी भी अपने पर एक नंगे नंगे रेपो का उपयोग करेंगे। हालांकि स्थानीय मशीन, क्योंकि आप संभवतः अपने स्नैपशॉट को संपादित करना चाहते हैं)।

यदि आप नंगे रेपो और एक अन्य उदाहरण उपयोग मामले के बारे में अधिक गहराई से स्पष्टीकरण चाहते हैं, तो मैंने एक ब्लॉग पोस्ट यहाँ लिखी है: https://stegosaurusdormant.com/bare-git-repo/


4

यह एक नया उत्तर नहीं है, लेकिन इससे मुझे ऊपर दिए गए उत्तर के विभिन्न पहलुओं को समझने में मदद मिली (और यह एक टिप्पणी के लिए बहुत अधिक है)।

जीआईटी बैश का उपयोग करने की कोशिश करें:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init
Initialized empty Git repository in C:/Test/.git/

me@pc MINGW64 /c/Test (master)
$ ls -al
total 20
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 .git/

me@pc MINGW64 /c/Test (master)
$ cd .git

me@pc MINGW64 /c/Test/.git (GIT_DIR!)
$ ls -al
total 15
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ../
-rw-r--r-- 1 myid 1049089 130 Apr  1 11:35 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:35 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:35 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 objects/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 refs/

उसी के साथ git --bare:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init --bare
Initialized empty Git repository in C:/Test/

me@pc MINGW64 /c/Test (BARE:master)
$ ls -al
total 23
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:11 ../
-rw-r--r-- 1 myid 1049089 104 Apr  1 11:36 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:36 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:36 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 objects/

2

$ git help repository-layout

एक गिट रिपॉजिटरी दो अलग-अलग स्वादों में आती है:

  • कार्यशील पेड़ की जड़ में एक .गित निर्देशिका;
  • एक .IT निर्देशिका जो एक नंगे भंडार (यानी अपने काम करने वाले पेड़ के बिना) है, जिसका उपयोग आम तौर पर दूसरों के साथ इतिहास का आदान-प्रदान करने और इसे लाने से किया जाता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.