केंद्रीय भंडार के रूप में गिट का उपयोग करना


12

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

हालांकि, मेरी केवल एक विकास मशीन में एक स्थिर आईपी है। मेरा दिमाग सीवीएस मोड में अटका हुआ है, इसलिए मैंने उस मशीन को 'सेंट्रल' सर्वर होने के लिए सेट करने की कोशिश की, जिसे सभी लोग खींचते हैं।

इस तरह का काम करता है। मेरे पास मशीनों एसी का एक गुच्छा है जो 'मास्टर' एम से एक गिट-पुल करते हैं। वे डेटा को वापस भेजने के लिए गिट पुश करते हैं।

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

git reset --hard HEAD

जो थोड़ा ज्यादा लगता है। और अगर मैं रीसेट करने से पहले केंद्रीय मशीन पर विकास करता हूं, तो मुझे यकीन नहीं है कि इसे उन परिवर्तनों के साथ कैसे मर्ज किया जा सकता है जिन्हें पहले से ही धक्का दिया गया है।

मेरे मानसिक मॉडल के बारे में कुछ तरीका है। मदद?


जब आप "मास्टर" कहते हैं, तो क्या आप मास्टर भंडार के बारे में या मास्टर शाखा के बारे में बात कर रहे हैं?
इन्नाएम

मास्टर रिपॉजिटरी
बजे एलेक्स फेनमैन

1
गिट संदर्भ में "मास्टर" आमतौर पर डिफ़ॉल्ट शाखा का नाम है।
इन्नाएम

यह शायद SO
केन लियू

जवाबों:


30

आप चाहते हैं कि आपका केंद्रीय भंडार नंगे हो। कहो मशीन जिस पर रहती है उसका नाम है static:

$ ssh static git init --bare /git/myproject.git

यह नंगे रिपॉजिटरी एक केंद्रीय मिलन स्थल है: यह विकास से नहीं बल्कि इससे आगे बढ़ने और खींचने के लिए है।

केंद्रीय भंडार के क्लोनों पर अपना विकास करें:

$ cd ~/src
$ git clone static:/git/myproject.git

यहां तक ​​कि अगर तुम पर हो static, एक क्लोन में काम:

$ git clone /git/myproject.git

यद्यपि आप इस रिपॉजिटरी पर काम करने वाले एकमात्र व्यक्ति हैं, लेकिन अपना काम करने की आदत डालें, जिसे git प्रलेखन विषय की शाखाएँ कहता है । इसका एक तात्कालिक लाभ यह है कि यह एक स्वच्छ मास्टर रखता है , यही है कि आप अपनी केंद्रीय मास्टर शाखा से अपने वर्तमान स्थानीय भंडार के मास्टर में बिना किसी विलय के खींच सकते हैं।

उदाहरण के लिए:

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."

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

हो सकता है कि आप उस रात घर जाएं और एक नई सुविधा जोड़ी जाए। अगली सुबह, आप

$ git checkout master
$ git pull

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

लेकिन अब कहते हैं कि आपने फू बग को ठीक कर दिया है और इसे अपनी मास्टर शाखा में शामिल करने के लिए तैयार हैं। पहले आप इसे पिछली रात से बदलावों के साथ एकीकृत करना चाहते हैं:

$ git checkout fix-bug-in-foo
$ git rebase master

rebaseआदेश अपने भंडार देखो बनाता है जैसे कि आप पिछली रात की नई सुविधा की चोटी पर foo बग तय की। (यह तरह तरह का है svn update, लेकिन अधिक लचीला और शक्तिशाली है।)

अब इसे अपने केंद्रीय मास्टर में प्राप्त करने के लिए:

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master

हम मास्टर को विशेष मान रहे हैं, लेकिन यह केवल पारंपरिक है। आप विभिन्न रिपॉजिटरी की विभिन्न शाखाओं पर काम staticको आसानी से आसानी से git रिपॉजिटरी के जरिए साझा कर सकते हैं।


1
बहुत बढ़िया जवाब, नाखूनों के नीचे सभी मुद्दों पर।
डैन लोवेनहर्ज़

मेरा git इंस्टिट स्वीकार नहीं कर रहा है - init (पुराने वर्जन ??) को git के विकल्प के रूप में स्वीकार करें, लेकिन मैंने इसे अपने मौजूदा रेपो को क्लोन करके काम किया है, और फिर मैन्युअल रूप से फाइल को थोड़ा एडिट करना है।
एलेक्स Feinman

यदि आप 1.6.4.x git चला रहे हैं, तो यह git init --bareकोई अन्य तर्क नहीं है। यदि सेट है तो यह वर्तमान वर्किंग डायरेक्टरी या GIT_DIR पर्यावरण सेटिंग का उपयोग करेगा। मेरा मानना ​​है कि आपको निर्देशिका तर्क लेने के लिए git 1.6.5.x की आवश्यकता है।
डैरेन हॉल

4
यह सबसे अच्छा git वर्कफ़्लो स्पष्टीकरण है जो मैंने अभी तक उस काम के लिए देखा है जो मैं कर रहा हूं।
ग्रेग ग्राहम

8

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


6

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

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

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit

इसने रेपो साइट पर एक खाली नंगे रेपो का निर्माण किया।

अब अगर मेरे पास स्थानीय स्तर पर पहले से मौजूद रेपो है, तो मैं इसे दूरस्थ साइट पर धकेल सकता हूं।

$ cd ~/src/dotconf

स्थानीय निर्देशिका में chdir।

$ git remote add origin ssh://example.com/~/dotconf.git

रिमोट रेपो को मूल के रूप में जोड़ें, इसलिए पुश / पुल उस रेपो पर कार्य करेगा।

$ git push origin master

मेरे स्वामी को मूल में पुश करें (जैसा कि पहले रिमोट रिमोट के माध्यम से लेबल किया गया था)। अब उस रिमोट रेपो को मेरा 'सेंट्रल रेपो' मान लिया गया है। मेरे सभी गिट पुश / पुल मूल के साथ बातचीत करेंगे।

अगर मैं किसी अन्य होस्ट में जाता हूं, तो मैं आसानी से क्लोन के माध्यम से उस रेपो को एक नए स्थान पर खींच सकता हूं।

$ git clone ssh://example.com/~/dotconf.git

यदि मैं दूरस्थ सर्वर पर विकास करना चाहता हूं, तो मैं पहले क्लोन करता हूं, फिर नंगे रेपो में वापस धक्का / खींचता हूं।

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull

संभवत: आपको अपने सेट करना होगा git config --add branch.master.remote originताकि git pullशिकायत नहीं है कि आप विशिष्ट पर्याप्त नहीं किया जा रहा है कर रहे हैं। अन्य विकल्प यह है कि अपनी मास्टर शाखा को --trackदूरस्थ मूल में सेट करें । उपयोगी यदि आपके पास कई शाखाएँ हैं।


1

मैं आज सिर्फ इसी समस्या पर शोध कर रहा था। इस ब्लॉग पोस्ट में इस मुद्दे पर बहुत चर्चा की गई है, लेकिन बहुमत की राय यह है कि मन्नी ने क्या कहा। डेविड फ्रेंच द्वारा कुछ अन्य संभावनाओं के लिए पोस्ट पर एक टिप्पणी को देखें, अगर आप इंडेक्स या काम करने वाले पेड़ में काम न करने वाले भंडार को धक्का देकर गलती करते हैं तो क्या करना है। "git reset -soft HEAD ^" आपके काम को बिगाड़े बिना धक्का दिया गया बदलाव वापस करेगा।


2
उस ब्लॉग पोस्ट की एक समस्या सूचकांक की उपयोगिता को छोड़ रही है। यहाँ यह समझाने के लिए एक अच्छा लेख है कि कैसे git के बजाय git के साथ काम किया जाए - osteele.com/archives/2008/05/my-git-workflow - वर्कफ़्लो आरेख शामिल हैं।
डैरेन हॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.