आप "git --bare init" रिपॉजिटरी का उपयोग कैसे करते हैं?


320

मुझे एक केंद्रीय गिट रिपॉजिटरी बनाने की जरूरत है लेकिन मैं थोड़ा भ्रमित हूं ...

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

$ mkdir test_repo
$ git --bare init

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

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

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

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

जवाबों:


391

सबसे पहले, बस जाँच करने के लिए, आपको उस निर्देशिका में बदलना होगा जिसे आपने चलाने से पहले बनाया है 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। )

आप लगभग हमेशा नंगे रिपॉजिटरी git pushको दूसरे रिपॉजिटरी से इसे (उपयोग करके ) पुश करके अपडेट करते हैं ।

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

git config receive.denyCurrentBranch ignore

सामुदायिक संपादन

git init --bare --shared=group

जैसा कि प्रशान्त ने टिप्पणी की है, यह वही है जो आप चाहते हैं कि अगर आप निजी होम प्रोजेक्ट के बजाय काम पर कर रहे हैं।


7
आप इस --sharedविकल्प को भी जोड़ सकते हैं initयदि आप अन्य लोगों को इस रेपो में धकेलने की योजना बनाते हैं। यह स्वचालित रूप से समूह लेखन अनुमतियों को रिपॉजिटरी से जोड़ता है - लिंक
prasanthv

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

1
उपयोगी आप नंगे और गैर नंगे रेपोस बीच का अंतर जानना चाहते हैं, तो stackoverflow.com/questions/7861184/...
गुइले अकोस्टा

अगर पेड़ काम नहीं कर रहा है, तो सामान कैसे मिलेगा? मुझे लगा कि git ऑब्जेक्ट स्टोर में एक काम करने वाला पेड़ है, और यही स्टेजिंग SHAs इंगित करता है और इंगित करता है
akantoword

@akantoword: git कमिट और ब्रांच की सभी जानकारी को कहीं स्टोर करता है। एक प्रतिबद्ध शायद फाइलों के पिछले संस्करण और नए संस्करण के बीच एक अंतर है। काम करने वाला पेड़ एक विशिष्ट समय में अपनी वास्तविक सामग्री का सिर्फ एक स्नैपशॉट है। वैसे भी, एक काम के पेड़ के साथ आप कमिट और शाखाओं के बीच आगे-पीछे जा सकते हैं। आप चाहें तो एक अलग कार्य करने वाले पेड़ पर भी चेकआउट कर सकते हैं।
user276648

246

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

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

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

1. नंगे रेपो की शुरुआत ...

> 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 adelphus@example.com
> 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 बी। मौजूदा फ़ाइलों से एक कार्यशील फ़ोल्डर बनाएं यदि आपके पास पहले से ही इसमें फ़ाइलों के साथ एक फ़ोल्डर है (ताकि आप इसमें क्लोन न कर सकें), तो आप एक नई गिट रेपो को इनिशियलाइज़ कर सकते हैं, पहले कमिट जोड़ सकते हैं और फिर बाद में इसे नंगे रेपो से जोड़ सकते हैं।

> 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.

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

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


4
दिलचस्प। निश्चित रूप से मेरे जवाब से अधिक विस्तृत। +1
वॉनसी

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

11
आप इस तरह के जवाब के लिए पैसे चार्ज करना चाहिए
आर्थर तारासोव

2
एक नए गिट उपयोगकर्ता के रूप में, यह उत्तर मेरे लिए अविश्वसनीय रूप से उपयोगी था, इसे लिखने के लिए धन्यवाद!
बग़ल में

1
यह एक शानदार जवाब है। हमारी यूनिट को बहुत मदद करेगा।
वोबोरसियानो

33

एक-एक करके अपने सवालों के जवाब देना:

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

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

केंद्रीय रिपॉजिटरी का एकमात्र तरीका रिपॉजिटरी होना ही bareहै।


22

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

git init --bare test_repo.git

20

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

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

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

यह कुछ इस तरह होगा:

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

git remote add central <url>SSH के मामले में, क्या इसका उपयोग करना भी शामिल है? जैसेgit remote add central ssh://user@server/home/user/repo.git
हाँ बैरी

17

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

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

अधिक जानकारी के लिए देखें " GIT: मैं अपने नंगे रेपो को कैसे अपडेट करूं? "
टिप्पणियाँ:

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

5

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

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

$ cd test_repo
$ git log --relative=/

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


5

मार्क लॉन्गेयर और रोबोप्रोग के जवाबों के आधार पर:

अगर 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

यह कॉन्फिगर कमांड: यह आपके द्वारा बनाए गए .IT डायरेक्टरी पर लागू होने के लिए कैसे समाप्त होता है?
GreenAsJade

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

@GreenAsJade यह इसलिए है क्योंकि आप अभी भी git रिपॉजिटरी के फ़ोल्डर के अंदर हैं, इसलिए यह उस पर लागू होता है (git config का डिफ़ॉल्ट विकल्प की तरह है --local)।
ब्लूकोडर

2

--Bare फ्लैग एक रिपॉजिटरी बनाता है जिसमें वर्किंग डायरेक्टरी नहीं होती है। नंगे रिपॉजिटरी केंद्रीय रिपॉजिटरी है और आप विलय की त्रुटि से बचने के लिए यहां कोड्स को संपादित (स्टोर) नहीं कर सकते।

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

मशीन 1 में स्थानीय रिपोजिटरी और मशीन 2 में 'कॉपी' रिपॉजिटरी दोनों नंगे हैं। नंगे और गैर-नंगे भंडार के बीच संबंध

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


0

आप अपने स्थानीय रिपॉजिटरी को इनिशियलाइज़ करने के लिए निम्न कमांड निष्पादित कर सकते हैं

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

आपको अपने स्थानीय रिपॉजिटरी से अपनी परियोजना पर काम करना चाहिए और सर्वर को केंद्रीय भंडार के रूप में उपयोग करना चाहिए।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.