"गिट init" और "git init --bare" में क्या अंतर है?


162

क्या git initऔर किसके बीच का अंतर है git init --bare? मैंने पाया कि --bareउनके Git सर्वर के लिए बहुत सारे ब्लॉग पोस्ट की आवश्यकता है?

से आदमी पेज , यह कहा:

--bare

एक नंगे भंडार का निर्माण करें। यदि GIT_DIR वातावरण सेट नहीं है, तो यह वर्तमान कार्यशील निर्देशिका पर सेट है

लेकिन वास्तव में इसका क्या मतलब है? क्या --bareGit सर्वर सेटअप के लिए होना आवश्यक है ?

जवाबों:


143

नॉन-बेयर गिट रेपो

यह संस्करण एक कार्यशील निर्देशिका के साथ एक भंडार बनाता है ताकि आप वास्तव में काम कर सकें ( git clone)। इसे बनाने के बाद आप देखेंगे कि निर्देशिका में एक .गित फ़ोल्डर होता है जहां इतिहास और सभी गिट प्लंबिंग जाता है। आप उस स्तर पर काम करते हैं जहाँ .it फ़ोल्डर होता है।

बेर गित रेपो

अन्य संस्करण एक कार्यशील निर्देशिका ( git clone --bare) के बिना एक रिपॉजिटरी बनाता है । आपको वह निर्देशिका नहीं मिलती जहाँ आप काम कर सकते हैं। निर्देशिका में सब कुछ अब उपरोक्त मामले में .it फ़ोल्डर में निहित था।

आप एक बनाम दूसरे का उपयोग क्यों करेंगे

वर्किंग डायरेक्टरी के बिना git repos की आवश्यकता इस तथ्य से है कि आप शाखाओं को इसमें धकेल सकते हैं और यह प्रबंधित नहीं करता है कि कोई व्यक्ति क्या काम कर रहा है। आप अभी भी एक रिपॉजिटरी को धक्का दे सकते हैं जो नंगे नहीं है, लेकिन आप खारिज कर दिया जाएगा क्योंकि आप संभावित रूप से एक शाखा को स्थानांतरित कर सकते हैं जो उस कार्यशील निर्देशिका में किसी पर काम कर रहा है।

तो बिना वर्किंग फोल्डर वाले प्रोजेक्ट में, आप केवल ऑब्जेक्ट्स को देख सकते हैं क्योंकि git उन्हें स्टोर करता है। वे संकुचित और क्रमबद्ध हैं और अपनी सामग्री के SHA1 (एक हैश) के तहत संग्रहीत हैं। एक नंगे भंडार में एक वस्तु प्राप्त करने के लिए, आपको git showउस ऑब्जेक्ट के sha1 को निर्दिष्ट करना होगा जिसे आप देखना चाहते हैं। आपको ऐसा कोई ढांचा दिखाई नहीं देगा जैसा आपका प्रोजेक्ट दिखता है।

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

यदि आप इस परियोजना पर काम कर रहे हैं या आपको "तार्किक रूप से केंद्रीय" भंडार की आवश्यकता नहीं है, तो आपको किसी भी नंगे भंडार की आवश्यकता नहीं हो सकती है। उस मामले में अन्य रिपॉजिटरी में git pull से एक पसंद करेगा । यह उन आपत्तियों से बचता है जो गैर-नशीले पदार्थों के भंडार में धकेलने पर होती हैं।

उम्मीद है की यह मदद करेगा


रखें , बाहर फेंक एक इस लाइन से - एक एक दूसरे से Git पुल पसंद करेंगे ... :-)
Arup रक्षित

10
मुझे यह उत्तर बहुत अस्पष्ट और भ्रामक लगता है। कुछ कारण यहाँ हैं: meta.stackoverflow.com/questions/339837/…
Marko Avlijaš

Bare repositories are usually central repositories where everyone moves their work to.क्या आपके कहने का मतलब यह है कि एक नंगे भंडार वह स्रोत है जहाँ से अन्य परियोजना सहयोगी किसी परियोजना का क्लोन बना सकते हैं? यही है, सहयोगी इसे मानते हैं remote?
मिन्ह ट्रान

112

संक्षिप्त जवाब

एक नंगे रिपॉजिटरी एक वर्किंग कॉपी के बिना एक git रिपॉजिटरी है, इसलिए .git की सामग्री उस निर्देशिका के लिए शीर्ष-स्तर है।

स्थानीय रूप से काम करने के लिए गैर-नंगे भंडार का उपयोग करें और अन्य लोगों के साथ अपने परिवर्तनों को साझा करने के लिए केंद्रीय सर्वर / हब के रूप में एक नंगे भंडार का उपयोग करें। उदाहरण के लिए, जब आप github.com पर एक रिपॉजिटरी बनाते हैं, तो इसे नंगे रिपॉजिटरी के रूप में बनाया जाता है।

तो, आपके कंप्यूटर में:

git init
touch README
git add README
git commit -m "initial commit"

सर्वर पर:

cd /srv/git/project
git init --bare

फिर ग्राहक पर, आप धक्का देते हैं:

git push username@server:/srv/git/project master

फिर आप इसे रिमोट के रूप में जोड़कर अपने आप को बचा सकते हैं।

सर्वर साइड पर रिपॉजिटरी पुल और पुश के माध्यम से कमिट करने जा रही है, न कि आप फाइलों को एडिट करके और फिर सर्वर मशीन में उन्हें कमिट कर रहे हैं, इसलिए यह नंगे रिपॉजिटरी है।

विवरण

आप एक रिपॉजिटरी को धक्का दे सकते हैं जो एक नंगे रिपॉजिटरी नहीं है, और गिट यह पता लगाएगा कि वहाँ एक .it रिपॉजिटरी है, लेकिन जैसा कि अधिकांश "हब" रिपॉजिटरी को वर्किंग कॉपी की आवश्यकता नहीं है, इसके लिए नंगे रिपॉजिटरी का उपयोग करना सामान्य है। इसकी सिफारिश की गई है और इस तरह के रिपॉजिटरी में काम करने वाली कॉपी होने का कोई मतलब नहीं है।

हालांकि, यदि आप एक गैर-नंगे भंडार में धकेलते हैं, तो आप कार्य की प्रतिलिपि को असंगत बना रहे हैं, और git आपको चेतावनी देगा:

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

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

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


अगर मैं git सर्वर पर अपने प्रोजेक्ट को काम करना चाहता हूं, तो यह आवश्यक नहीं है - विकल्प, है ना?
किट हो

आप दूरस्थ रिपॉजिटरी के लिए नंगे का उपयोग करते हैं, स्थानीय के लिए नहीं।
डंकन

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

60

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

अंतर का एक अच्छा उदाहरण निम्नलिखित तरीके से वर्णित किया जा सकता है :

--bareआपको सिर्फ एक भंडारण स्थान देता है (आप वहां विकास नहीं कर सकते हैं)। इसके बिना --bareआपको वहां विकसित करने की क्षमता है (और एक भंडारण स्थान है)।

git initआपकी वर्तमान निर्देशिका से एक गिट रिपॉजिटरी बनाता है। यह इसके अंदर .it फ़ोल्डर जोड़ता है और यह आपके संशोधन इतिहास को शुरू करना संभव बनाता है।

git init --bareएक रिपॉजिटरी भी बनाता है, लेकिन उसके पास काम करने वाली निर्देशिका नहीं है। इसका मतलब है कि आप फ़ाइलों को संपादित नहीं कर सकते, अपने परिवर्तनों को कर सकते हैं, उस भंडार में नई फाइलें जोड़ सकते हैं।

--bareमददगार कब हो सकते हैं? आप और कुछ अन्य लोग प्रोजेक्ट पर काम कर रहे हैं और git का उपयोग कर रहे हैं। आपने कुछ सर्वर पर प्रोजेक्ट होस्ट किया है ( amazon ec2)। आप में से प्रत्येक की अपनी मशीन है और आप अपने कोड को आगे बढ़ाते हैं ec2। आप में से कोई भी वास्तव में कुछ भी विकसित नहीं करता है ec2(आप अपनी मशीनों का उपयोग करते हैं) - आप बस अपने कोड को धक्का देते हैं। तो आपके ec2सभी आपके कोड के लिए सिर्फ एक भंडारण है और इसे --bareबिना किसी के --bare(और शायद सिर्फ एक, और अन्य सब कुछ क्लोन करना होगा) के रूप में बनाया जाना चाहिए । वर्कफ़्लो इस तरह दिखता है:

यहां छवि विवरण दर्ज करें


1
तो, हम कह सकते हैं कि - एक दुर्लभ भंडार का उपयोग करके हम एक प्रकार का क्लाइंट-सर्वर आर्किटेक्चर बना सकते हैं जैसा कि तोड़फोड़ करता है?
एमिलियानो सांगोई

14

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


रेपो --bare विकल्प के साथ, इसलिए हम सभी प्रोजेक्ट फ़ाइल नहीं देख सकते हैं? ऐसा लगता है कि मैं अपने सभी प्रोजेक्ट फ़ाइल को --bare विकल्प के साथ खो देता हूं ..
किट हो

11

एक गैर-नंगे भंडार डिफ़ॉल्ट है। यह तब बनता है जब आप चलाते हैं git init, या जब आप bareसर्वर से क्लोन ( विकल्प के बिना ) करते हैं तो आपको क्या मिलता है।

जब आप इस तरह एक रिपॉजिटरी के साथ काम करते हैं, तो आप उन सभी फ़ाइलों को देख और संपादित कर सकते हैं जो रिपॉजिटरी में हैं। जब आप रिपॉजिटरी के साथ बातचीत करते हैं - उदाहरण के लिए परिवर्तन करके - Git आपके परिवर्तनों को एक छिपी निर्देशिका में संग्रहीत करता है जिसे कहा जाता है .git

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

जब आप किसी सर्वर से क्लोन करते हैं तो .gitआपकी वर्किंग कॉपी बनाने के लिए Git के पास वह सारी जानकारी होती है जो उसे चाहिए होती है।


1

--बेयर और वर्किंग ट्री रिपॉजिटरी के बीच एक और अंतर यह है कि पहले मामले में कोई खोए हुए कमिट को स्टोर नहीं किया जाता है, लेकिन केवल यह माना जाता है कि ब्रांच ट्रैक से संबंधित है । दूसरी ओर, वर्किंग ट्री सभी तरह के काम करता है। निचे देखो...

मैंने पहला रिपॉजिटरी (नाम: गिट-नंगे ) बनाया git init --bare। यह सर्वर है। यह बाईं ओर है, जहाँ कोई दूरस्थ शाखाएँ नहीं हैं क्योंकि यह दूरस्थ भंडार है।

मैंने पहले के साथ दूसरा भंडार (नाम: गिट-वर्किंग-ट्री ) बनाया git clone। यह दांई ओर है। इसकी स्थानीय शाखाएँ दूरस्थ शाखाओं से जुड़ी हुई हैं।

(ग्रंथ 'प्रथम', 'दूसरा', 'तीसरा', 'चौथा', 'अल्फा', 'बीटा' और 'डेल्टा' प्रतिबद्ध टिप्पणियाँ हैं। 'मास्टर' और 'ग्रीक' नाम शाखा नाम हैं।)

स्थानीय और दूरस्थ रिपोजिटरी

अब मैं गिट-नंगे (कमांड :)git push --delete origin greek और स्थानीय रूप से गिट-वर्किंग-ट्री (कमांड git branch -D greek) दोनों में 'ग्रीक' नामक शाखा को हटा दूंगा । यहाँ पेड़ कैसा दिखता है:

गिट-नंगे रिपॉजिटरी हटाता है जो अब संदर्भित नहीं है

Git-नंगे भंडार दोनों शाखा और सभी संदर्भित comits हटा देता है। तस्वीर में हम देखते हैं कि इस कारण से इसका पेड़ कम हो गया था।

दूसरी ओर, गिट-वर्किंग-ट्री रिपॉजिटरी, जो आमतौर पर उपयोग किए जाने वाले स्थानीय रिपॉजिटरी के बराबर है, कमिट्स को डिलीट नहीं करता है, जिसे अब केवल git checkout 7fa897b7कमांड के साथ सीधे आपके हैश द्वारा संदर्भित किया जा सकता है । यही कारण है कि इसके पेड़ की अपनी संशोधित संरचना नहीं है।

BRIEF में: कार्य-ट्री रिपॉजिटरी में कमिट को कभी नहीं छोड़ा जाता है, लेकिन नंगे रिपॉजिटरी में हटा दिया जाता है।

व्यावहारिक रूप से, आप सर्वर पर केवल एक हटाए गए शाखा को पुनर्प्राप्त कर सकते हैं यदि यह एक स्थानीय भंडार में मौजूद हो।

लेकिन यह बहुत अजीब है कि दूरस्थ शाखा को हटाने के बाद नंगे भंडार का आकार डिस्क आकार में नहीं घटता है। यही है, फ़ाइलें अभी भी किसी भी तरह वहाँ हैं। अब जो संदर्भित नहीं है या जिसे कभी भी संदर्भित नहीं किया जा सकता है (बाद वाले मामले) को हटाकर भंडार को डंप करने के लिए git gc --pruneकमांड का उपयोग करें


Git कमांड को आज़माने के लिए प्रयास करें: github.com/sergiocabral/App.GitPlayground
सर्जियो कैबरल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.