गैर-नंगे गिट भंडार पर कैसे धकेलें?


150

मैं आमतौर पर ssh (स्क्रीन और vim) के माध्यम से एक रिमोट सर्वर पर काम करता हूं, जहां मेरे पास Git रिपॉजिटरी है। कभी-कभी मैं ऑनलाइन नहीं होता, इसलिए मेरे लैपटॉप पर एक अलग रिपॉजिटरी (मेरे रिमोट से क्लोन किया गया) है।

हालाँकि, मैं इस रिपॉजिटरी से रिमोट की तरफ नहीं खींच सकता क्योंकि मैं आमतौर पर एक फ़ायरवॉल के पीछे हूँ या मेरे पास एक सार्वजनिक आईपी नहीं है।

मैंने पढ़ा है कि मुझे सिर्फ एक नंगे भंडार में धकेलना चाहिए। फिर मुझे अपने दूरस्थ रिपॉजिटरी में अपने परिवर्तनों को कैसे धकेलना चाहिए?



3
2 रिमोट रिपोज, एक नंगे और एक सामान्य, और हुक का उपयोग करें। एक परेशानी की तरह लगता है, लेकिन गिट तैयार और आधिकारिक गिट विकी के अनुसार , आपको केवल एक नंगे रेपो को धक्का देना चाहिए । शायद यही कारण है कि अधिकांश git रेपो होस्ट (जैसे GitHub, Bitbucket) में पोस्ट-प्राप्त हुक शामिल हैं, इसलिए आप अपने सर्वर पर एक URL पर POST कर सकते हैं जो एक स्क्रिप्ट चलाता है जो उदाहरण के लिए निष्पादित करता है git pull github master
जेक बर्गर

जवाबों:


137

receive.denyCurrentBranch updateInstead

यह विकल्प Git 2.3 में जोड़ा गया था , और यह साफ होने पर सर्वर को अपने कार्यशील पेड़ को अद्यतन करता है।

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

नमूना उपयोग:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

आउटपुट:

a
b

क्या यह संभव नहीं है कि हेरोको जैसे नंगे रेपो का निर्माण किए बिना धक्का दिया जाए
ANINJa

2
@ANJJ मुझे समझ में नहीं आता, क्या मेरा उदाहरण बिल्कुल ऐसा नहीं है?
सिरो सेंटिल्ली 12 冠状 iro i

है --localवैकल्पिक?
युकुएल

@ Yukulélé --localकेवल वर्तमान निर्देशिका को --globalप्रभावित करता है , सभी git repos को प्रभावित करता है ~/.gitconfig, देखें man git-config
सिरो सेंटिल्ली 郝海东 i iro i

1
@CiroSantilli 新疆 C 六四 ill ill ill धन्यवाद, डॉक्स पढ़ने के बाद मैं पुष्टि करता हूं कि यह आवश्यक नहीं है "(आप कह सकते हैं - -लोकल लेकिन वह डिफ़ॉल्ट है)"
युकुलिएल

146

सर्वोत्तम विकल्प

संभवतः आपके गैर-नंगे रिमोट रिपॉजिटरी में धकेलने के लिए सबसे साफ, कम से कम भ्रमित करने वाला और सबसे सुरक्षित तरीका है, रिमोट में समर्पित शाखाओं को धकेलना जो आपकी लैपटॉप शाखाओं का प्रतिनिधित्व करते हैं।

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

git push origin master:laptop-master

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

वैकल्पिक विकल्प

केवल मास्टर -> मास्टर को धक्का देना भी संभव है, लेकिन गैर-नंगे रेपो की वर्तमान में जांच की गई शाखा को धक्का देना आम तौर पर अनुशंसित नहीं है, क्योंकि यह भ्रमित हो सकता है यदि आप समझ नहीं पाते हैं कि क्या चल रहा है। ऐसा इसलिए है क्योंकि चेक-आउट ब्रांच में जाने से वर्क ट्री अपडेट नहीं होता है, इसलिए git statusजिस चेक-आउट ब्रांच में धकेल दिया गया था, उसकी जाँच करने पर ठीक वैसा ही अंतर दिखाई देगा जैसा हाल ही में देखा गया था। यह विशेष रूप से भ्रामक होगा यदि काम पेड़ को धक्का देने से पहले गंदा हो गया था, जो एक बड़ा कारण है कि यह अनुशंसित नहीं है।

यदि आप केवल मास्टर -> मास्टर को आगे बढ़ाने की कोशिश करना चाहते हैं, तो कमांड सिर्फ:

git push origin

लेकिन जब आप रिमोट रेपो में वापस जाते हैं, तो आप सबसे अधिक संभावना है कि git reset --hard HEADकाम के पेड़ को उस सामग्री के साथ सिंक करने के लिए करना चाहते हैं जिसे धक्का दिया गया था। यह खतरनाक हो सकता है , क्योंकि अगर दूरस्थ कार्य के पेड़ में कोई भी अनपेक्षित परिवर्तन हैं जो आप रखना चाहते थे तो यह उन्हें मिटा देगा। सुनिश्चित करें कि आप जानते हैं कि इससे पहले कि आप इसे आज़माएं, या कम से कम पहले बैकअप बना लें, इसके परिणाम क्या हैं!

EDIT Git 2.3 के बाद से, आप "पुश-टू-परिनियोजित" git पुश: https://github.com/blog/1957-git-2-3-has-been-released का उपयोग कर सकते हैं । लेकिन एक अलग शाखा में धकेलना और फिर विलय आमतौर पर बेहतर होता है क्योंकि यह एक वास्तविक मर्ज करता है (इसलिए मर्ज करता है जैसे बिना किसी बदलाव के काम करता है)।


1
क्या लैपटॉप-मास्टर को धक्का देने के बाद शाखा को स्वचालित करना संभव है?
rdoubleui

3
@rdoubleui: क्या आपका मतलब " विलय को स्वचालित करना " था? यदि हां, तो नहीं, मर्ज को स्वचालित करना संभव नहीं है क्योंकि मर्ज मानव हस्तक्षेप के बिना संभव होने की गारंटी नहीं है। ऐसे विवाद हो सकते हैं जिन्हें हल करने की आवश्यकता है।
डेन मोल्डिंग

7
बाद के संस्करणों (?) में, git config receive.denyCurrentBranch ignoreगैर-नंगे रेपो पर धकेलने से पहले किया जाना चाहिए
prusswan

3
शानदार जवाब @DanMoulding, धन्यवाद। @rdoubleui: आप हमेशा एक कमांड लाइन को बैश फंक्शन की तरह बचा सकते हैं:git push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
रिच

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

17

मेरा सुझाव है कि आपके सर्वर में एक नंगे-रिपॉजिटरी और एक स्थानीय कामकाजी (गैर-नंगे) प्रतिनिधि होंगे। आप लैपटॉप से ​​सर्वर नंगे रेपो में परिवर्तन को धक्का दे सकते हैं और फिर उस नंगे रेपो से सर्वर काम करने वाले रेपो तक खींच सकते हैं। मेरे कहने का कारण यह है क्योंकि आपके पास सर्वर में कई पूर्ण / अपूर्ण शाखाएँ हो सकती हैं जिन्हें आप लैपटॉप पर दोहराना चाहेंगे।

इस तरह से आपको सर्वर में बदलाव को आगे बढ़ाते हुए रेपो पर काम करने वाले ब्रांच की स्थिति के बारे में चिंता करने की जरूरत नहीं है।


4

एक अन्य विकल्प रिवर्स एसश सुरंग को सेटअप करना है ताकि आप पुश के बजाय खींच सकें।

# start the tunnel from the natted box you wish to pull from (local)
$ ssh -R 1234:localhost:22 user@remote

# on the other box (remote)
$ git remote add other-side ssh://user@localhost:1234/the/repo
$ git pull other-side

और अगर आप चाहते हैं कि सुरंग पृष्ठभूमि में चले

$ ssh -fNnR 1234:localhost:22 user@remote

1

तुम कर सकते हो:

$git config --bool core.bare true

इसे नंगे या केंद्रीय रिपॉजिटरी में किया जा सकता है ताकि यह किसी भी फाइल को स्वीकार कर ले जो गैर-नॉन रिपॉजिटरी से धकेल दी गई हो। यदि आप इसे नंगे नंगे भंडार में करते हैं तो हम किसी भी फाइल को नंगे नंगे से नंगे भंडार में धकेल नहीं सकते हैं।

यदि आप पीसी में केंद्रीय और गैर-नंगे रेपो बनाकर जीआईटी का अभ्यास कर रहे हैं तो यह कुछ पीसी में धकेली गई फाइलों को नहीं दिखा सकता है लेकिन इसे धक्का दे दिया गया है। आप इसे चलाकर देख सकते हैं।

$git log केंद्रीय रेपो में।

इसके अलावा अगर आप GitHub पर धक्का देते हैं तो यह वहां की फाइलों को दिखाएगा।

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