गिट शाखा नाम में स्लैश चरित्र का उपयोग करना


222

मुझे पूरा यकीन है कि मैंने एक लोकप्रिय गिट प्रोजेक्ट में कहीं देखा था कि शाखाओं में "फीचर / xyz" जैसा एक पैटर्न था।

हालांकि जब मैं स्लैश चरित्र के साथ एक शाखा बनाने की कोशिश करता हूं, तो मुझे एक त्रुटि मिलती है:

$ git branch labs/feature
error: unable to resolve reference refs/heads/labs/feature: Not a directory
fatal: Failed to lock ref for update: Not a directory

के लिए एक ही समस्या (मेरा प्रारंभिक प्रयास):

$ git checkout -b labs/feature

स्लैश चरित्र के साथ Git में एक शाखा कैसे बनाई जाती है?

git  branch 

1
वास्तव में ऐसा लगता है कि आपको अपनी समस्या है HEAD। ऐसा लगता है कि git को लगता है कि आपकी HEADउस शाखा का लिंक है labs/featureजिसे बनाया नहीं गया है। मुझे नहीं पता कि यह कैसे हो सकता है, लेकिन इसका मतलब यह है कि आपके द्वारा foo/barइसके आधार पर एक शाखा बनाने का प्रयास किया जा रहा है, यह काम नहीं कर रहा है। किसी भी विचार कैसे अपने HEADunstuck आया?
सीबी बेली

मैं भ्रम के लिए माफी चाहता हूं, इसकी "प्रयोगशाला / सुविधा", "फू / बार" नहीं, संपादित उदाहरण।

FWIW स्लैश से पहले कुछ भी एक निर्देशिका उत्पन्न करेगा .git/refs/headsअर्थात यदि आप करते हैं git checkout -b feature/123तो अपनी projectRootFolder/.git/refs/headsनिर्देशिका के अंदर आपको एक निर्देशिका नाम दिखाई देगा: featureजहाँ उस निर्देशिका के अंदर आपको नाम की एक शाखा दिखाई देगी 123। बाद में यदि आप निर्देशिका के feature/124अंदर एक और बनाते हैं feature, तो आपको एक शाखा दिखाई देगी जिसका नाम है124
Honey

:-D "वास्तव में ऐसा लगता है कि आपको अपने HEAD" नाइस वन @CBBailey
केंट बुल

जवाबों:


222

क्या आप सुनिश्चित हैं कि शाखा labsपहले से मौजूद नहीं है (जैसे कि इस धागे में )?

आपके पास एक फ़ाइल और एक निर्देशिका नहीं हो सकती है।

आप मूल रूप से यह करने के लिए गिट पाने की कोशिश कर रहे हैं:

% cd .git/refs/heads
% ls -l
total 0
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 labs
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 master
% mkdir labs
mkdir: cannot create directory 'labs': File exists

आप "निर्देशिका नहीं बना सकते" त्रुटि के बराबर हो रहे हैं।
जब आपके पास इसमें स्लैश वाली एक शाखा होती है, तो यह एक निर्देशिका पदानुक्रम के तहत संग्रहीत होती है .git/refs/heads


3
गहराई से उत्तर के लिए धन्यवाद .. अंतरराज्यीय रूप से मैंने कोशिश की git शाखा फू / बार (जो काम किया); फिर git शाखा -d foo / bar, लेकिन मैं देखता हूं कि foo / निर्देशिका (अब खाली) अभी भी मौजूद है! संपादित करें: और जैसे ही मैं "गिट शाखा फू" करता हूं, इसे बदल दिया जाता है। सब ठीक हैं।

1
@ एफएबी: दुष्ट ... लेकिन अप्रत्याशित नहीं: आपने बार ( foo'नामस्थान में) को हटा दिया , लेकिन ऐसा नहीं है foo(जो अन्य शाखा के लिए एक नामस्थान के रूप में काम कर सकता है या स्वयं एक शाखा हो सकता है)
वॉन

यह वास्तव में मायने नहीं रखता है, लेकिन जब आप कॉल करते हैं pack-refs, तो git अपना रुख नहीं बदलता है , इसलिए यह आपको इससे बचाने के लिए अपने रास्ते से बाहर जा रहा है।
जोश ली

23
उत्तर को संक्षेप में देने के लिए: आपके पास शाखा नामों में स्लैश हो सकते हैं। ओपी के पास पहले से ही एक labsशाखा थी और बनाने की कोशिश की गई थी labs/feature, जिस पर गिट ने बल दिया।
डुओजमो

107

पदानुक्रमित शाखा नाम (स्लैश के साथ शाखा नाम) होना संभव है। उदाहरण के लिए मेरे भंडार में मेरी ऐसी शाखा है (तों)। एक चेतावनी यह है कि आपके पास रिपॉजिटरी में शाखा 'फू' और शाखा 'फू / बार' दोनों नहीं हो सकते हैं।

आपकी समस्या नाम में स्लैश के साथ शाखा बनाने के साथ नहीं है।

$ गिट शाखा फू / बार
त्रुटि: संदर्भ refs / प्रमुखों / प्रयोगशालाओं / सुविधा को हल करने में असमर्थ: एक निर्देशिका नहीं
घातक: अद्यतन के लिए रेफरी लॉक करने में विफल: निर्देशिका नहीं

उपरोक्त त्रुटि संदेश 'प्रयोगशाला / सुविधा' शाखा के बारे में बात करता है, न कि 'फू / बार' (जब तक कि यह copy'n'paste में गलती नहीं है, अर्थात आपने सत्र के कुछ हिस्सों को संपादित किया है)। का परिणाम क्या है git branchया git rev-parse --symbolic-full-name HEAD?


1
धन्यवाद, भ्रम के बारे में क्षमा करें, मैंने पहली बार एक फू / बार उदाहरण लिखा था, लेकिन अपने वास्तविक परीक्षण से त्रुटि संदेश पेस्ट करें। फिर से नहीं करेंगे :) और मेरी गलती के लिए भी खेद है, वास्तव में मेरे पास पहले से ही एक "प्रयोगशाला" शाखा थी।

33

कभी-कभी यह समस्या तब होती है जब आपके पास पहले से ही आधार नाम की एक शाखा है।

मैंने यह कोशिश की:

git checkout -b features/aName origin/features/aName

दुर्भाग्य से, मेरे पास पहले से ही एक शाखा थी जिसका नाम था features, और मुझे प्रश्न पूछने वाले का अपवाद मिला।

शाखा को हटाने से featuresसमस्या का समाधान हो गया, उपरोक्त आदेश ने काम किया।


32

मेरे मामले में, मैं भूल गया कि पहले से ही एक अप्रयुक्त labsशाखा थी। इसे हटाने से समस्या हल हो गई:

git branch -d labs
git checkout -b labs/feature

स्पष्टीकरण:

प्रत्येक नाम केवल एक मूल शाखा या एक सामान्य शाखा हो सकती है, दोनों नहीं। यही कारण है कि शाखाओं labs और labs/feature एक ही समय में दोनों मौजूद नहीं हो सकते।

इस व्यवहार का कारण यह है कि शाखाएँ फ़ाइल सिस्टम में संग्रहीत हैं और वहाँ भी आपके पास एक फ़ाइल labsऔर एक निर्देशिका labsसमान स्तर पर नहीं हो सकती है।


-1

मैं गलत हो सकता हूं, लेकिन मैंने सोचा कि स्लैश केवल शाखा नामों में दिखाई देते हैं जब वे एक दूरस्थ रेपो से संबंधित होते हैं, उदाहरण के लिए origin/master


11
यह पूरी तरह से संभव है - और वास्तव में आम है - उनके नाम में '/' के साथ स्थानीय शाखाएं बनाना। यह संबंधित शाखाओं को 'नेमस्पेस' में समूहीकृत करने का एक सामान्य तरीका है।
सीबी बेली

हाँ, ईमानदार होना जो सीखने के दौरान भ्रमित हो सकता है, लेकिन नामकरण उपयोगी भी हो सकता है। फिर स्लैश या डैश का उपयोग करते हुए, मुझे यकीन नहीं है कि क्या यह व्यक्तिगत स्वाद से परे है?

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