2011-10-03 16 views
231

मैं एक केंद्रीय Git भंडार बनाने की जरूरत है, लेकिन मैं थोड़ा भ्रमित हूँ ...आप "git --bare init" भंडार का उपयोग कैसे करते हैं?

मैं के साथ एक नंगे भंडार बनाया है (मेरे Git सर्वर, मशीन 2 में):

$ mkdir test_repo 
$ git --bare init 

अब मैं फ़ाइलों को अपने स्थानीय भंडार (मशीन 1) से नंगे भंडार (मशीन 2) में धक्का देना होगा। मेरे पास एसएसएच द्वारा मशीन 2 तक पहुंच है। बात यह है कि मुझे लगता है कि मैं एक नंगे भंडार की अवधारणा को समझ नहीं पा रहा हूं ...

नंगे भंडार में अपना कोड संग्रहीत करने का सही तरीका क्या है? मैं अपने स्थानीय भंडार से नंगे भंडार में परिवर्तन कैसे बढ़ा सकता हूं?

क्या एक केंद्रीय भंडार रखने का सही तरीका एक नंगे भंडार है?

मैं इस विषय के साथ थोड़ा उलझन में हूं। कृपया मुझे इस पर एक सुराग दें।

उत्तर

298

सबसे पहले, बस जांचने के लिए, आपको git init --bare चलाने से पहले बनाई गई निर्देशिका में बदलने की जरूरत है। साथ ही, नंगे भंडारों को विस्तार .git देने के लिए पारंपरिक है। तो तुम

git init --bare test_repo.git 

कर सकते हैं Git संस्करणों के लिए < 1.8 आप कर

mkdir test_repo.git 
cd test_repo.git 
git --bare init 

अपने बाद में सवालों के जवाब देने के लिए होता है, नंगे खजाने (परिभाषा के द्वारा) एक काम कर उन्हें संलग्न पेड़ की जरूरत नहीं है, इसलिए आप आसानी से के रूप में आप एक सामान्य गैर नंगे भंडार में होगा उन्हें फ़ाइलें नहीं जोड़ सकते हैं (उदाहरण के लिए git add <file> और बाद में एक git commit साथ।)

आप लगभग हमेशा इसे करने के लिए जोर दे रहा एक बेयर भंडार अद्यतन (का उपयोग कर) एक और भंडार से।

ध्यान दें कि इस मामले में आपको लोगों को अपनी रिपॉजिटरी में जाने की अनुमति देनी होगी। जब test_repo.git अंदर, कर

git config receive.denyCurrentBranch ignore 

=== समुदाय संपादित ===

git init --bare --shared=group 

रूप prasanthv द्वारा टिप्पणी की, यह आप क्या चाहते हैं, तो आप काम पर यह कर रहे हैं, बल्कि एक निजी के लिए की तुलना में है घर परियोजना

+5

यदि आप अन्य लोगों को इस रेपो में धक्का देने की योजना बना रहे हैं तो आप 'init' के लिए' --shared' विकल्प भी जोड़ सकते हैं। यह स्वचालित रूप से भंडार में समूह लेखन अनुमतियों को जोड़ता है - [लिंक] (http://git-scm.com/book/en/Git-on-the- सर्वर- गेटिंग- गिट-on-a- सर्वर) – prasanthv

+14

मुझे लगता है कि ये तीन लाइनों इस से एक ही प्रभाव है केवल एक: Git --bare init test_repo.git कम से कम मेरे वर्तमान Git संस्करण (1.8.2.2) –

+1

@Fran 1.7 के लिए अच्छा नहीं है * संस्करण ऐसा लगता है के साथ:। \ – deepdive

17

यह पर्याप्त होना चाहिए:

git remote add origin <url-of-bare-repo> 
git push --all origin 

अधिक जानकारी के लिए "GIT: How do I update my bare repo?" देखें।
नोट्स:

  • आप एक अलग नाम 'origin' की तुलना में नंगे रेपो दूरदराज के संदर्भ के लिए उपयोग कर सकते हैं।
  • यह आपके टैग को धक्का नहीं देगा, इसके लिए आपको एक अलग git push --tags origin की आवश्यकता है।
30

आपके प्रश्नों का एक के बाद एक का जवाब:

नंगे भंडार एक कोई काम कर पेड़ किया है। इसका मतलब है कि आपकी पूरी सामग्री .git निर्देशिका में है।

आप अपने स्थानीय क्लोन से push तक नंगे भंडार में केवल commit कर सकते हैं। इसमें कोई काम करने वाला पेड़ नहीं है, इसलिए इसमें कोई भी फाइल संशोधित नहीं है, कोई बदलाव नहीं है।

केंद्रीय भंडार रखने के लिए bare भंडार होना एकमात्र तरीका है।

20

सामान्य अभ्यास केंद्रीय भंडार है जिसे आप एक नंगे रेपो के रूप में दबाते हैं।

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

आपको अपने स्थानीय रेपो से नंगे रेपो में रिमोट जोड़ने और अपने "कोड" को धक्का देने की आवश्यकता है।

यह उन सभी लोगों के लिए कुछ की तरह:

git remote add central <url> # url will be ssh based for you 
git push --all central 
+0

एसएसएच के मामले में 'गीट रिमोट जोड़ें केंद्रीय ' का उपयोग करना, इसमें पथ भी शामिल होगा? जैसे 'गिट रिमोट केंद्रीय एसएसएच जोड़ें: // उपयोगकर्ता @ सर्वर/होम/उपयोगकर्ता/repo.git' –

5

यह सत्यापित करने के लिए कोड आप वास्तव में धक्का दे दिया प्रतिबद्ध हो गया अच्छा है।

आप - रिश्तेदार विकल्प का उपयोग करके पथ को स्पष्ट रूप से सेट करके एक नंगे भंडार पर परिवर्तनों का लॉग प्राप्त कर सकते हैं।

$ cd test_repo 
$ git log --relative=/ 

यह आपको प्रतिबद्ध परिवर्तन दिखाएगा जैसे कि यह एक नियमित गिट रेपो था।

20

तुम भी आप के लिए निर्देशिका बनाने में Git पूछ सकते:

git init --bare test_repo.git 
151

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

नोट: यह उदाहरण नंगे रेपो के स्थान के लिए स्थानीय पथ का उपयोग करता है, लेकिन अन्य गिट प्रोटोकॉल (जैसे ओपी द्वारा संकेतित एसएसएच) को ठीक काम करना चाहिए।

मैंने गिट से कम परिचित लोगों के लिए कुछ नोट्स जोड़ने की कोशिश की है।

1. नंगे रेपो Initialise ...

> git init --bare /path/to/bare/repo.git 
Initialised empty Git repository in /path/to/bare/repo.git/ 

यह एक फ़ोल्डर (repo.git) बनाता है और एक Git रेपो का प्रतिनिधित्व Git फाइलों के साथ यह भरता है। जैसा कि यह खड़ा है, यह रेपो बेकार है - इसमें कोई काम नहीं है और अधिक महत्वपूर्ण बात यह है कि कोई शाखा नहीं है। यद्यपि आप इस रेपो को क्लोन कर सकते हैं, आप इससे खींच नहीं सकते हैं।

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

2 ए।खाली रेपो

git clone /path/to/bare/repo.git /path/to/work 
Cloning into '/path/to/work'... 
warning: You appear to have cloned an empty repository. 
done. 

क्लोनिंग यह आदेश अगर /path/to/work मौजूद नहीं है या किसी रिक्त फ़ोल्डर है केवल काम करेंगे करके एक नया काम कर फ़ोल्डर (कोई मौजूदा फ़ाइलें) बनाएँ। चेतावनी का ध्यान रखें - इस चरण में, आपके पास अभी भी कुछ भी उपयोगी नहीं है। आप cd /path/to/work और चलाते हैं git status, आप की तरह कुछ मिल जाएगा:

On branch master 

Initial commit 

nothing to commit (create/copy files and use "git add" to track) 

लेकिन यह एक झूठ है। आप वास्तव में शाखा master पर नहीं हैं (क्योंकि git branch कुछ भी नहीं लौटाता है) और अब तक, कोई काम नहीं है।

इसके बाद, कॉपी/स्थानांतरित /, काम फ़ोल्डर में कुछ फ़ाइलों को बनाने के git और पहली प्रतिबद्ध बनाने के लिए उन्हें जोड़ने।

> cd /path/to/work 
> echo 123 > afile.txt 
> git add . 
> git config --local user.name adelphus 
> git config --local user.email [email protected] 
> git commit -m "added afile" 
[master (root-commit) 614ab02] added afile 
1 file changed, 1 insertion(+) 
create mode 100644 afile.txt 

git config आदेशों केवल जरूरत है अगर आप पहले से Git तुम कौन हो नहीं बताया है। ध्यान दें कि यदि अब आप git branch चलाते हैं, तो अब आप सूचीबद्ध master शाखा देखेंगे। अब git status चलाएँ:

On branch master 
Your branch is based on 'origin/master', but the upstream is gone. 
    (use "git branch --unset-upstream" to fixup) 

nothing to commit, working directory clean 

यह भी भ्रामक है - नदी के ऊपर "चला गया" नहीं, यह सिर्फ अभी तक नहीं बनाया गया है गया है और git branch --unset-upstream मदद नहीं करेगा। लेकिन यह ठीक है, अब हमारे पास हमारी पहली प्रतिबद्धता है, हम धक्का दे सकते हैं और मास्टर नंगे रेपो पर बनाए जाएंगे।

> git push origin master 
Counting objects: 3, done. 
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done. 
Total 3 (delta 0), reused 0 (delta 0) 
To /path/to/bare/repo.git 
* [new branch]  master -> master 

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

> git pull 
Already up-to-date. 
> git push origin master 
Everything up-to-date 

2 बी। मौजूदा फ़ाइलों से एक काम फ़ोल्डर बनाएँ आप पहले से ही उस में फ़ाइलें (ताकि आप इसे में क्लोन नहीं कर सकता), आप एक नया Git रेपो आरंभ कर सकते हैं, जोड़ने के लिए पहली बार के लिए प्रतिबद्ध है और फिर नंगे रेपो करने के लिए इसे बाद में लिंक के साथ एक फ़ोल्डर है।

> cd /path/to/work_with_stuff 
> git init 
Initialised empty Git repository in /path/to/work_with_stuff 
> git add . 
# add git config stuff if needed 
> git commit -m "added stuff" 

[master (root-commit) 614ab02] added stuff 
20 files changed, 1431 insertions(+) 
create mode 100644 stuff.txt 
... 

इस बिंदु पर हमारे पास हमारी पहली प्रतिबद्धता और स्थानीय मास्टर शाखा है जिसे हमें रिमोट-ट्रैक अपस्ट्रीम शाखा में बदलने की आवश्यकता है।

> git remote add origin /path/to/bare/repo.git 
> git push -u origin master 
Counting objects: 31, done. 
Delta compression using up to 4 threads. 
Compressing objects: 100% (31/31), done. 
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done. 
Total 31 (delta 11), reused 0 (delta 0) 
To /path/to/bare/repo.git 
* [new branch]  master -> master 
Branch master set up to track remote branch master from origin. 

नोट स्थापित करने के लिए Git धक्का पर -u ध्वज (नया) नदी के ऊपर शाखा पर नज़र रखी। बस के रूप में पहले, अब हम एक पूरी तरह कार्यात्मक नंगे रेपो जो एक स्थानीय काम कर प्रति खींच और धक्का कर सकते हैं और साथ ही एक मास्टर शाखा पर कहीं और क्लोन किया जा सकता है।

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

+1

दिलचस्प। निश्चित रूप से मेरे उत्तर से अधिक विस्तृत। +1 – VonC

+7

यह उत्तर मेरी समस्या का समाधान करता है और स्वीकार्य उत्तर होना चाहिए, उम्मीद है कि अधिक से अधिक लोग इसे वोट दे सकते हैं। – inix

+0

इस उपयोगी उत्तर के लिए धन्यवाद –

1

--bare झंडा भंडार है कि एक कार्यशील निर्देशिका नहीं है बनाता है। नंगे भंडार केंद्रीय भंडार है और आप विलय त्रुटि से बचने के लिए यहां कोड (स्टोर) संपादित नहीं कर सकते हैं।

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

मशीन 1 में स्थानीय भंडार और मशीन 2 में 'प्रतिलिपि' भंडार दोनों गैर-बेकार हैं। relationship between bare and non-bare repositories

ब्लॉग आपको इसे समझने में मदद करेगा। https://www.atlassian.com/git/tutorials/setting-up-a-repository

0

मार्क Longair & Roboprog जवाब के आधार पर:

अगर Git संस्करण> = 1,8

git init --bare --shared=group .git 
git config receive.denyCurrentBranch ignore 

या:

अगर Git संस्करण < 1,8

mkdir .git 
cd .git 
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore 
+0

वह कॉन्फ़िगर कमांड: यह आपके द्वारा अभी बनाई गई .git निर्देशिका पर लागू होने का अंत कैसे होता है? – GreenAsJade

+0

मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूं? क्या आप अधिक सटीक हो सकते हैं? चूंकि आपके पास गिट रिपोजिटरी शुरू हुई है, इसलिए आप इसे 'git config' कमांड के साथ जितना चाहें कॉन्फ़िगर कर सकते हैं .. – Jack

संबंधित मुद्दे