2013-01-17 46 views
5

यहां परिदृश्य है। मेरे पास दो मशीनें हैं, "डेस्कटॉप" और "लैपटॉप"।मैं दो गिट भंडारों को सिंक में कैसे रखूं?

डेस्कटॉप पर मुझे क्या करना:

mkdir git_test 
cd git_test 
git init 
dd if=/dev/urandom of=test.img bs=1k count=1000 
git add test.img 
git commit -m "Added first image" 

फिर लैपटॉप पर मैं करता हूँ:

git clone [USER]@desktop:/home/[USER]/git_test  
cd git_test 
dd if=/dev/urandom of=test2.img bs=1k count=1000 
git add test2.img 
git commit -m "Added second image" 

तब मैं अपने डेस्कटॉप पर Git रेपो चाहते अपने लैपटॉप पर Git रेपो तरह देखने के लिए। 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'. 

मैं कैसे सिंक में इन दोनों रेपोस रहते हो?

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

कृपया निम्नलिखित ध्यान दें!

  • मैं कई कारणों से GitHub की तरह एक केंद्रीकृत रेपो उपयोग करने के लिए, नहीं करना चाहती। पहला सुरक्षा है। दूसरा सादगी है। तीसरा यह है कि परिस्थितियों के कारण मैं यहां नहीं जाऊंगा, मैं कुछ रिमोट सर्वर से इंटरनेट कनेक्शन रखने पर भरोसा नहीं कर सकता, मेरे पास बस दो मशीनें लैन के माध्यम से जुड़ी हैं। अंत में, मैं जानना चाहता हूं कि जिस तरह से मैंने अनुरोध किया है, वैसे ही ज्ञान के उस विशिष्ट टुकड़े को हासिल करने के लिए।

  • मैं भी एक नंगे रेपो का उपयोग नहीं करना चाहता, क्योंकि एक नंगे रेपो में रूट डीआईआर में क्रॉफ्ट का गुच्छा है। यह बदसूरत और गन्दा है। सबवर्सन से गिट में जाने का पूरा कारण यह है कि गिट एक क्लीनर, विकेन्द्रीकृत समाधान की तरह दिखता है। इसके अलावा, मेरे पास कुछ हद तक गैर-तकनीकी लोग हैं जो डेस्कटॉप की रूट डायर में काम करेंगे, वे क्रूर द्वारा काफी भ्रमित हो जाएंगे। गिट की सुंदरता है (मैंने सोचा था कि सब कुछ .git फ़ोल्डर्स में छुपाता है। संपादित करें: जाहिर है मैं इस बिंदु के साथ पर्याप्त स्पष्ट नहीं था। कल्पना करें कि मेरे पास निम्न उप फ़ोल्डर के साथ "दस्तावेज़" फ़ोल्डर है: mydata1 और mydata2। यह एक प्रत्याशित उदाहरण नहीं है, यह वही मुद्दा है जिसे मैं सौदा करने की कोशिश कर रहा हूं। mydata1 "test.img" और केवल उस फ़ाइल को शामिल करना चाहिए, लेकिन इसके बजाय यह अब है:

    शाखाओं config वर्णन प्रमुख हुक जानकारी वस्तुओं refs

मैं सक्षम होने के लिए करना चाहता था mydata1 में बस cd करने के लिए और फ़ाइलों को संपादित करना प्रारंभ करें, लेकिन इसके बजाय मुझे शाखाओं के माध्यम से कोशिश करना और सीडी करना है, या जो कुछ भी काम करने के लिए है। और के लिए इस प्रकार की निर्देशिका संरचना के लिए प्रत्येक सबफ़ोल्डर जो "दस्तावेज़" में था, केवल अनावश्यक है। कृपया, कृपया मुझे इस तरह से काम करने के लिए मत कहो। कृपया सवाल का जवाब दें। धन्यवाद।

ये दो अंक पूरे कारण हैं कि मैं यहां इस प्रश्न को पोस्ट कर रहा हूं।अगर आपको इस प्रश्न का उत्तर है तो कृपया केवल उत्तर दें। :) धन्यवाद!!

+0

"क्रॉफ्ट" जिसका मैं जिक्र कर रहा हूं, निम्नलिखित है: "शाखा कॉन्फ़िगरेशन विवरण हेड हुक जानकारी ऑब्जेक्ट रेफ्स" मैं बस/home/[user]/git_repo में केवल उन फ़ाइलों को शामिल करना चाहता हूं जिनके साथ मैं काम कर रहा हूं। इसके अलावा: .git फ़ोल्डर्स छुपाए गए हैं। –

+0

आप रेपो छुपा सकते हैं। – nobar

उत्तर

10

ऐसा करने का एक तरीका खींचना, धक्का देना नहीं है। आप पहली बार मशीन पर अपने दो मशीनों, सेट करने के बाद:

git remote add origin [USER]@laptop:/home/[USER]/git_test 
git pull # Complains about untracked branch while adding the branch you want to track 
git branch --set-upstream master origin/master 
git pull 

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

+0

खींचें मेरे वर्कफ़्लो के लिए पूरी तरह से काम करता है, जब तक मुझे एक नंगे रेपो या केंद्रीकृत रेपो से निपटने की ज़रूरत नहीं है। इस स्पष्टीकरण के लिए धन्यवाद। मैं इस वर्कफ़्लो का परीक्षण करूंगा और वापस रिपोर्ट करूंगा। धन्यवाद! –

+1

मशीनों को थोड़ा शारीरिक रूप से अलग करने के लिए काफी दबाव डालने की संभावना नहीं है: 'alias git_push = "ssh remotemachine' cd git_test; git pull ''' – cjc343

+0

जैसे कुछ के लिए एक बैश उपनाम बनाएं, यह निश्चित रूप से जाने का तरीका है। गौर करें कि क्या दो प्रतिनिधि आपके और किसी और के थे; आप नहीं चाहते कि वह अन्य व्यक्ति अपनी सामग्री को अपने भंडार में डंप कर दे और वह नहीं चाहता कि आप उसे अपने अंदर डंप कर लें। नए काम को खींचने के लिए काफी अलग कहानी, शायद इसे एक अलग शाखा में, इसे धक्का देने के बजाय। –

2

मुझे याद आ रहा है कि आप एक नंगे रेपो का उपयोग क्यों नहीं करना चाहते हैं, और मेरा मानना ​​है कि पुल केवल समाधान को ठीक काम करना चाहिए, लेकिन मुझे यह भी विश्वास है कि "क्रूर" अभी भी काम करते समय आपकी इच्छानुसार छिपी जा सकती है एक नंगे रेपो के साथ।

अपने डेस्कटॉप पर, यदि आप:

mkdir git_test 
git init --bare git_test 

और फिर:

git clone bare_repo_directory new_location 

आप धक्का और नंगे रेपो के लिए सामान्य रूप से खींच क्लोन से (डिफ़ॉल्ट रूप से मूल रूप में यह संदर्भित) कर सकते हैं, और इसमें कोई अतिरिक्त सामग्री शामिल नहीं होगी; क्लोन में केवल .git निर्देशिका होगी।

पुश करने के लिए आप को चलाने के लिए की आवश्यकता होगी:

git push origin master (assuming you're working out of master) 

अपने लैपटॉप के लिए:

git clone [USER]@desktop:path_to_bare 

और काम क्लोन कॉपी में सामान्य होना चाहिए। आप मूल से धक्का और खींचेंगे (जो नंगे रेपो है), लेकिन आपको सीधे इसमें काम करने की आवश्यकता नहीं है।

1

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

दो त्वरित समाधान:

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

> git symbolic-ref HEAD refs/heads/non-existent 
:
> git checkout <any-hash> 
Note: checking out '<any-hash>'. 

You are in 'detached HEAD' state... 

एक नया रेपो के साथ एक और तरीका है, अगर आप master को पुश करने के लिए चाहते हैं, बस कुछ और master का नाम नहीं है कि प्रारंभिक शाखा बदलने के लिए है

यह आपको एक नई स्थिति में master के साथ एक समान स्थिति में रखेगा, जिसमें कोई काम नहीं है। बस आप मास्टर को पकड़ नहीं पाएंगे और इस प्रकार इसे धक्का प्राप्त करने की अनुमति होगी।

1

मुझे हाल ही में एक समस्या थी जहां मेरा सर्वर और डेस्कटॉप सिंक हो गया था। थोड़ी देर के लिए वेब के चारों ओर खोज करने के बाद मुझे एक ऐसा जवाब नहीं मिला जो मेरी सटीक स्थिति से निपटा। इसलिए मैंने रैकस्पेस समर्थन को बुलाया और वे मुझे ऑनलाइन ढूंढने में सक्षम होने के मुकाबले एक बेहतर उत्तर देने के लिए सक्षम थे।

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

यहाँ चला गया गलत

मैं Magento के लिए मिठाई टूथ प्लगइन स्थापित करने की कोशिश कर रहा था और हमेशा की तरह कदम हम सभी Magento एक्सटेंशन स्थापित करने के माध्यम से जाने के साथ साथ पालन किया है। इसका मतलब है फाइलों का एक गुच्छा लेना और उन्हें मेरे ऐप, जेएस, और स्किन निर्देशिका में डालना।

ऐप/डिज़ाइन/adminhtml निर्देशिका में एक "बेस" फ़ोल्डर है। यदि आप Magento के बारे में कुछ भी जानते हैं तो आप जानते हैं कि बेस फाइलों के साथ गड़बड़ करने के बारे में उनके पास एक अरब चेतावनी है। संक्षेप में - ऐसा मत करो।

मुझे लगता है कि चूंकि मेरे स्थानीय रेपो में "बेस" निर्देशिका नहीं थी, इसलिए मैं इसे अपनी स्थानीय मशीन पर रखूंगा। दुर्भाग्य से और मेरी निराशा के लिए, इसका मतलब था कि जब मैंने अपना ऐड किया तो उसने "बेस" निर्देशिका को केवल मीठे टूथ के लिए फाइलों के साथ जोड़ा। जब मैं इसे सर्वर पर डालता हूं तो यह मेरी पूरी बेस निर्देशिका और बूम मिटा देता है! नीचे Magento चला गया।

Git रीसेट --hard HEAD @ {1}

यह आदेश लेता है:

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

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

यहाँ मैं यह

जाहिर है यह आप एक बहुत कष्टप्रद जगह में छोड़ देता है क्योंकि मेरे सर्वर पर एक Git खींच कर पोंछ बाहर होगा मेरी "आधार" निर्देशिका हर बार कैसे हल है। इसके अलावा, यह दो आगे बढ़ता है क्योंकि मैं सिर्फ एक प्रतिबद्धता को रोलबैक नहीं कर सकता।

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

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

तो आपको इसे डेस्कटॉप से ​​ठीक करना होगा और आपको उन डर्न फ़ाइलों को कैश से बाहर करने की आवश्यकता है।

डेस्कटॉप

से सिंक समस्या दूर करने की कैश से बाहर फ़ाइलें प्राप्त करने के लिए मैं निम्न आदेश से अधिक जारी किए गए, और अधिक, और फिर जब तक फ़ाइलें है कि मैं हटा दिया था भी हटा दिया गया है Git के अनुसार ।

Git rm -r --cached/फ़ोल्डर/निर्देशिका

और

Git rm --cached/फ़ोल्डर/फ़ाइलें

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

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

** निष्कर्ष और सीखे गए सबक **

सबक यहाँ सीखा कुछ बड़े लोगों के थे और मैं अपने आप को मेरे लिए क्या नहीं की याद दिलाने के लिए के रूप में अन्य प्रोग्रामर ने वही समस्या है के लिए इस पोस्ट लिख रहा हूँ और साथ ही फिर से करो

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

  2. अगर आप गलती से चीजों को पेंच है, तो

  3. Git आराम --hard HEAD @ {1} अपने सबसे अच्छे हो सकता है Git के साथ फ़ाइलों को दूर करने के लिए, अपने स्थानीय फाइल सिस्टम से उन्हें हटा नहीं है सुनिश्चित करें दोस्त कभी कभी

मुझे आशा है कि यह किसी और इसी तरह की स्थिति में है कि मदद करता है। मैंने ऑनलाइन दस्तावेज़ों के माध्यम से घंटों बिताए लेकिन मुझे यहां आने वाली जटिलताओं के साथ कुछ भी नहीं मिला, इसलिए अगर मैं किसी और को कुछ समय बचाने में मदद कर सकता हूं और कुछ कम ग्रे बाल प्राप्त कर सकता हूं तो मेरा दुःस्वप्न दुनिया के लिए कुछ अच्छा काम करेगा !