Git: एक नंगे भंडार में सक्रिय शाखा को बदलने का सही तरीका?


195

मेरे पास एक नंगे भंडार है जो मेरी परियोजना के लिए केंद्रीय स्टोर के रूप में उपयोग किया जाता है। सभी डेवलपर्स इसके git clone <repo>साथ साझा करने के लिए करते हैं । जब वे क्लोन करते हैं, वे गुरु शाखा के एक चेकआउट मिल (जब तक वे करते हैं git clone -n) क्योंकि repo.git/HEADशामिल ref: refs/heads/master, इस बनाने सक्रिय शाखा

सवाल यह है कि मैं सक्रिय शाखा को कैसे ठीक से बदलूं ? मैं बस repo.git/HEADसीधे फ़ाइल को हैक कर सकता था , लेकिन यह बुरा लगता है और, ठीक है, हैकी।

मैंने git checkout <otherbranch>रेपो .gitडायरेक्टरी में करने की कोशिश की , लेकिन वह असफल रहा क्योंकि मैं एक काम के पेड़ में नहीं था।

मैंने कोशिश की, git update-ref HEAD refs/heads/otherbranchलेकिन अपडेटेड रेफरी / हेड्स / मास्टर को रिफ्स / हेड्स / अदरब्रंच (ठीक है, मैंने वही किया जो डमी रिपॉजिटरी में था, न कि मेरा प्रोडक्शन वन!)

मैंने कोशिश की git update-ref --no-deref HEAD refs/heads/otherbranchऔर वह लगभग काम कर गया। इसने HEADफ़ाइल को अद्यतन किया , लेकिन इसने इसे इंगित किए गए वचन के SHA1 में सेट कर दिया refs/heads/otherbranch

मैं git संस्करण के साथ परीक्षण कर रहा हूं 1.7.0.2.msysgit.0

मैं अनुमान लगा रहा हूं कि ऐसा करने का कोई तरीका नहीं है git push, क्योंकि सभी और विविध को आपकी डिफ़ॉल्ट शाखा बदलने की अनुमति थोड़ी असुरक्षित (!) लगती है, लेकिन निश्चित रूप से रेपो .gitडायरेक्टरी में इसे सीधे हैक करने की तुलना में बेहतर तरीका है HEAD


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

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

15
@ निचलोलक रात IMHO आप यहाँ मूलभूत रूप से गलत हैं। शाखा नाम के रूप में "मास्टर" के बारे में कुछ खास नहीं है, यह सिर्फ एक डिफ़ॉल्ट है। रेस्पिरेटरीज़ में जो हमारे पास है, उसकी मास्टर शाखा नहीं है, क्योंकि "मास्टर" कंपनी के लिए सार्थक नहीं है। जब भी हम कोई रिलीज़ करते हैं तो हम नए रिलीज़ नंबर के साथ एक नई रखरखाव शाखा बनाते हैं, और सक्रिय शाखा के रूप में असाइन करते हैं।
Spacemoose

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

1
वाह - यह सवाल बस चलता है और चलता है - यह मेरा नंबर 1 प्रतिष्ठा बिंदु स्कोरर है! "मास्टर" के बारे में बात यह है कि यह सिर्फ एक नाम है, और अगर यह आपके संगठन, टीम, परियोजना, चरण, जो कुछ भी समझ में नहीं आता है, तो कुछ ऐसा चुनें जो आईएस उपयुक्त हो ताकि जब आप सहयोगी अपने रेपो को क्लोन करें तो वे तुरंत स्विच करें कॉन्फ़िगरेशन प्रबंधक के रूप में आप जो शाखा चाहते हैं, वे चाहते हैं कि वे चालू रहें। मैं ClearCase (bletch!) के साथ काम करता था, इसलिए आपकी पसंद "मुख्य", "मुख्य" या "मुख्य" थी। युक।
कोबरा

जवाबों:


280

यदि आपके पास दूरस्थ नंगे रेपो तक पहुँच है, तो यह लेख बताता है :

git symbolic-ref HEAD refs/heads/mybranch

जो आपकी रिपॉजिटरी में HEAD फाइल को अपडेट करेगा ताकि उसमें यह शामिल हो:

ref: refs/heads/mybranch

के रूप में प्रलेखित है git-symbolic-ref


यदि आपके पास दूरस्थ रेपो तक पहुँच नहीं है, तो मेरा पिछला उत्तर देखें


याद रखें कि जैसे एक कमांड git remote set-head:

  • दूरस्थ रेपो की डिफ़ॉल्ट शाखा को नहीं बदलता है ।
    यह केवल आपके स्थानीय रेपो में संग्रहीत रिमोट ट्रैकिंग शाखा को बदलता हैrefs/remotes/<name>/HEAD

  • HEADखुद को (फिर से, केवल refs/remotes/<name>/HEAD) नहीं बदलता है , इसलिए इसकी आवश्यकता है git symbolic-ref

तो यहाँ जवाब git remote set-head नहीं है।
git symbolic-ref HEADयदि आपके पास दूरस्थ रेपो तक सीधी पहुंच है।


3
धन्यवाद! मेरे पास दूरस्थ नंगे रेपो तक सीधी पहुंच है इसलिए गिट-प्रतीकात्मक-रेफ काम करेंगे। मुझे दूसरे धागे पर उल्लिखित नो-कॉमन-आंसर ट्रिक पसंद है, हालांकि - नीचे दराज के लिए निश्चित रूप से एक। मैंने इसके लिए Googling की उम्र बिताई लेकिन आपका पिछला जवाब नहीं मिल सका, फिर भी "git रिमोट हेड मास्टर" इसे git-Remote (1) के ठीक नीचे दूसरी सबसे बड़ी रैंक वाली हिट के रूप में पाता है। विचित्र। बस यह दिखाने के लिए कि किसी चीज़ को ढूंढना कितना कठिन है जब आप नहीं जानते कि आप वास्तव में क्या देख रहे हैं।
कोबोर

git symbolic-ref HEAD refs/heads/mybranchमेरे लिए बस ठीक काम किया! धन्यवाद! ;)
विनजेनबेज़र

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

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

@ मैग्नस जो एक नए पेज में पूछना अपने आप में एक अच्छा सवाल होगा।
VonC

3

उस शाखा को बदलने के लिए जिसे आप उपयोग करना चाहते हैं उस शाखा के संदर्भ में हेड को बदलना होगा।

पहले सभी संदर्भों को कर के नंगे भंडार में सूचीबद्ध करें

$find ref

फिर अपनी शाखा के लिए संदर्भ खोजें, प्रारूप इस प्रकार होगा refs/heads/<my_branch>। तो अगला चरण वर्तमान संदर्भ की जांच करना है, बस टाइप करें:

$git symbolic-ref HEAD

इसलिए आप जानते हैं कि वर्तमान शाखा कौन सी है, इसे आवश्यकतानुसार अपडेट करें।

$git sumbolic-ref HEAD ref/heads/<my_branch>

थान्ट्स इट। का आनंद लें।


2

एक्टिव ब्रांच को सही तरीके से कैसे बदलें?

  • स्थिति: रेपो .it निर्देशिका में git चेकआउट घातक है: यह ऑपरेशन किसी कार्य ट्री में चलाया जाना चाहिए

  • युक्तियाँ: बस - कार्य-वृक्ष तर्क जोड़ें

विस्तृत उदाहरण: मान्यताओं: दूरस्थ सर्वर पर नंगे गिट:

~ / नंगे_गीत_प्रतिष्ठित.संगित कार्य वृक्ष: / var / www / myappremote

स्थानीय सर्वर पर: शाखा संस्करण बनाएं। १. ((हमारा अन्य संपर्क)

git शाखा संस्करण ।.1.7

git पुश ओरिजिन वर्जन ।.1.7

दूरस्थ सर्वर पर git नंगे रेपो के साथ:

$ cd ~ / bare_git_repository.git

$ गिट शाखा

  • मास्टर
    संस्करण ।.1.7

जैसा कि कहा गया है, निम्नलिखित आदेश

git चेकआउट संस्करण ।.1.7

वापसी

घातक: यह ऑपरेशन एक काम के पेड़ में चलाया जाना चाहिए

निम्न आदेश का उपयोग करना

git --वर्क-ट्री = / var / www / myappremote चेकआउट संस्करण.1.7

सक्रिय शाखा को सफलतापूर्वक बदलें

$ गिट शाखा

गुरुजी

  • version.1.7

निम्नलिखित के साथ परिणामों की जाँच करें

ll / var / www / myappremote

आशा है कि यह मदद करेगा


यह बहुत ही सरल समाधान मेरे लिए काम किया, धन्यवाद! एक नोट: मुझे सफलतापूर्वक निष्पादित करने के लिए कमांड के लिए हाथ से एक खाली कार्य-वृक्ष निर्देशिका बनाना था।
जोएल एस्पोंडे

-1

इसके अलावा, अगर आपके पास नंगे भंडार तक पहुंच नहीं है, तो ए git remote set-head और आप कर रहे हैं

पिछली प्रतिक्रिया देखें


-3

मेरे पास हमारे सर्वर पर एक नंगे रेपो है और फ़ाइलों का उपयोग करके सफलतापूर्वक पुनर्प्राप्त करने में सक्षम है

git clone //server/repo/directory -b branch_name

एक नए स्थानीय रिपॉजिटरी में भले ही मैनपेज कहता हो कि यह केवल गैर-नंगे रिपॉजिटरी के लिए है।


1
जबकि आप जो कहते हैं वह सच है, जिस तथ्य का उपयोग आप -b एक विशेष शाखा का चयन करने के लिए करते हैं वह मेरे प्रश्न के संदर्भ में आपके उत्तर को तोड़ देता है, जो कि आप DEFAULT शाखा को कैसे सेट करते हैं।
kbro

-4

मैंने आवेदन करने से पहले और बाद में दो निर्देशिकाओं की तुलना की

git symbolic-ref HEAD refs/heads/mybranch

और ऐसा प्रतीत होता है कि केवल repo.git / HEAD फ़ाइल को बदल दिया गया था, इसलिए शायद यह फ़ाइल को "हैक" करने के लिए काफी सुरक्षित है।


2
सूक्ष्म ब्रेकिंग समस्याएं हैं जिन्हें सीधे जीआईटी रेफरी फाइलों को संपादित करके पेश किया जा सकता है। मैं इसके खिलाफ बहुत सलाह देता हूं। प्लंबिंग कमांड्स सीधे एडिटिंग रिफ की तुलना में आसान और सुरक्षित हैं।
Alain O'Dea

2
इस @boryn का क्या फायदा है?
एलेक्स चैंबरलेन

2
जीआईटी रेफरी के इतिहास की तरह पृष्ठभूमि में बहुत सी चीजों का ट्रैक रखता है। यदि आप फ़ाइल को मैन्युअल रूप से बदलते हैं तो वह लॉग नहीं होगी। यह सच है कि यह शायद मायने नहीं रखेगा। लेकिन अगर आप कुछ कमिट्स का ट्रैक खो देते हैं और उन्हें ढूंढना चाहते हैं, तो आपको खुशी होगी अगर आपने फ़ाइल को "हैक" नहीं किया।
qwerty9967

मैंने कमांड का उपयोग किया। लेकिन यह उत्तर यह समझने में मददगार था कि यह कैसे काम करता है, और, पक्षपातपूर्ण में, यह समझने के लिए कि रेफ्स / हेड्स कुछ आंतरिक है और मुझे इसे नहीं बदलना चाहिए, केवल "पथ" का अंतिम भाग। इसलिए, मैंने मतदान किया क्योंकि मुझे लगता है कि यह बहुमूल्य जानकारी थी।
माइक केस्किनोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.