git push: refs / heads / my / subbranch मौजूद है, नहीं बना सकता है


84

क्या किसी सर्वर पर रेपो में सोममे उप-फ़ोल्डर बनाना संभव नहीं है?

यदि मैं करता हूँ:

git push origin dev/master 

सब कुछ मिल जाए

लेकिन अगर मैं करता हूँ

git push origin dev/sub/master

मुझे यह मिल गया:

error: 'refs/heads/dev/sub' exists; cannot create 'refs/heads/dev/sub/master'

मैंने "गिट ब्रांच -r" के साथ जाँच की और सीधे ssh के साथ, वहाँ पहले से निर्मित देव / उप फ़ोल्डर नहीं है।

क्या गलत है?


1
Git ls- दूरस्थ मूल क्या लौटाता है?
इके

जवाबों:


152

यह एक फ़ोल्डर नहीं है जो मौजूद है, यह एक शाखा है । (खैर, इसमें एक फ़ोल्डर / निर्देशिका शामिल हो सकती है - या शायद नहीं, क्योंकि संदर्भ "पैक" मिलते हैं और निर्देशिका के भीतर फ़ाइलों के रूप में मौजूदा बंद हो जाते हैं।)

  • यदि शाखा bमौजूद है, तो नाम वाली कोई शाखा नहीं b/anythingबनाई जा सकती है।
  • इसी तरह, यदि शाखा dev/bमौजूद है , तो dev/b/cबनाई नहीं जा सकती।

यह एक git आंतरिक सीमा है। इस विशेष मामले में, रिमोट originकी एक शाखा है जिसका नाम dev/sub(चाहे आपके पास है या नहीं, महत्वपूर्ण बात यह है कि रिमोट के पास है)। आदेश बनाने के लिए, पर origin, नाम के एक शाखा dev/sub/master, आप पहली शाखा को हटाना चाहिए dev/subपर origin:

git push origin :dev/sub

(बेशक, इस शाखा को हटाने से वहां पर कुछ महत्वपूर्ण हटा दिया जा सकता है, इसलिए सुनिश्चित करें कि आप जानते हैं कि आप क्या कर रहे हैं। आम तौर पर, आप git fetch originसबसे पहले, उन्हें अपने dev/subरूप में कैप्चर करना चाह सकते हैं origin/dev/sub। आप फिर dev/renamed-subउसी प्रतिबद्धता की ओर इशारा करते हुए एक स्थानीय शाखा बना सकते हैं। , dev/renamed-subरिमोट पर बनाएँ , रिमोट डिलीट करें dev/sub, और फिर dev/sub/masterरिमोट बनाएं ।)


यदि आप रिमोट (जिस सिस्टम originपर होस्ट किया गया है) पर लॉग इन कर सकते हैं, तो आप वहां पर रिपॉजिटरी में जा सकते हैं और स्थानीय dev/subशाखा का नाम बदल सकते हैं । (नीचे दी गई टिप्पणियों के आधार पर, मुझे संदेह है कि वहाँ पर एक टूटी हुई ऑटो परिनियोजन स्क्रिप्ट भी है, जिसे संभवतः केवल "परिनियोजित" शाखाओं पर नियत किया जाना चाहिए, न कि जो कुछ भी धक्का दिया जाता है, उसके बजाय।


1
मुझे लगता है कि हम यहाँ शब्दावली पर उपद्रव कर रहे हैं। "आंतरिक सीमा" से मेरा मतलब है कि यह कुछ परिवर्तन है जिसे कोई भी परिवर्तन का उपयोग किए बिना कैसे दूर कर सकता है । एक अयोग्य सीमा कुछ अधिक मौलिक होगी, जैसे, अगर कोई SHA1 को तोड़ता है: जबकि यहां तक ​​कि इसे दूर किया जा सकता है (उदाहरण के लिए, SHA256 पर जाएँ), 40-वर्ण SHA-1s के विवरणों को उजागर किया जाता है, जैसे, अधिकांश हुक, इसलिए यह सीमा बाहरी क्षेत्रों में लीक हो जाती है।
टॉरक

2
यह एक अजीब तरह से परेशान सीमा, यह देखते हुए आपके पास करने के लिए चाहते हो सकता है है release/1.1और release/1.2साथ release/1.1/hofix/prevent-upload-borkऔर release/1.1/hotfix/assure-user-of-competence, आदि और, बल्कि सीमा बताते हुए की तुलना में त्रुटि संदेश होता है यहाँ एक (धन्यवाद)! लेकिन सरल और स्पष्ट स्पष्टीकरण के लिए धन्यवाद।
बेन्जोहोन

2
"यह एक आंतरिक आंतरिक सीमा है।" -- ठीक है, लेकिन क्यों? क्या इस तरह से लागू करना कुछ तर्क आसान था? या कुछ पेड़-ट्रैवर्सल? और क्या?
डी। कोवक्स

2
@ D.Kovács: उस मामले को मना करके, Git केवल संदर्भ हैश को उन फ़ाइलों में लिख सकता है, जिनके नाम को संदर्भ को पथ नाम के रूप में निर्मित करके बनाया गया है। यदि Git ने अनुमति दी है refs/tags/fooऔर refs/tags/foo/2, उदाहरण के लिए, यह ऐसा करने में सक्षम नहीं होगा: इसे अपने स्वयं के कुंजी-मूल्य स्टोर को लागू करने की आवश्यकता होगी। मुझे लगता है कि Git वैसे भी अपने स्वयं के कुंजी-मूल्य स्टोर को लागू करने के लिए मजबूर होने जा रहा है, लेकिन मुझे नहीं पता कि वे सीमा को हटा देंगे या नहीं।
torek

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

60

मैं उस स्थिति में था जब मैं भी नहीं ला सकता था क्योंकि मेरे रेपो में गैर-विद्यमान सुदूर शाखाओं के बारे में जानकारी थी, जिनकी मैंने जाँच भी नहीं की थी। मैंने इसका संयोजन (धन्यवाद @torek) चलाकर हल किया:

  • git branch -r दूरस्थ शाखाओं की स्थानीय प्रतियों को सूचीबद्ध करें
  • git ls-remote सुदूर शाखाओं की सूची बनाएं
  • git fetch --prune originदूरस्थ शाखाओं की स्थानीय प्रतियां अपडेट करें ( यह वास्तव में मेरी मदद नहीं की )
  • git remote prune originहटाए गए दूरस्थ शाखाओं के बारे में जानकारी निकालें ( यह किया )

8
git remote prune originइस त्रुटि की स्थिति को हल करने के लिए मैंने जो एकल कमांड चलाया था। वास्तव में भ्रामक संदेश - मेरे मामले में मैं "रिलीज़ / 2.6.0" पुश करने की कोशिश कर रहा था और मैंने पूरी 'रीफ़्स / रिमूव्स / ओरिजिन / रिलीज़ *' डीआईआर को हटा दिया था - फिर error: update_ref failed for ref 'refs/remotes/origin/release/2.6.0': cannot lock ref 'refs/remotes/origin/release/2.6.0': 'refs/remotes/origin/release' exists; cannot create 'refs/remotes/origin/release/2.6.0'भी जब भी मैं पुश / पुल / भ्रूण लाने की कोशिश कर रहा था शिकायत करते रहे।
कोन

30

मेरे लिए ->

त्रुटि =

fatal: cannot lock ref 'refs/heads/release/wl/2.3': 'refs/heads/release/wl' 
exists; cannot create 'refs/heads/release/wl/2.3'

समाधान =

$~ git update-ref -d refs/heads/release/wl
$~ git checkout release/wl/2.3

1
git update-ref -d refs / remotes ... मेरी समस्या का हल 'refs / remotes / मूल / हॉटफिक्स' मौजूद है; 'refs / remotes / मूल / हॉटफिक्स / ISSUE ...
Eduardo

इसने मेरी समस्या भी तय कर दी।
मिखाइल मोरफिकोव

16

वर्तमान में स्वीकार जवाब मुझे मदद नहीं की क्योंकि मैं नष्ट करने के लिए दूरदराज के रेपो पर एक रेफरी नहीं था - यह अपने स्थानीय पर विशुद्ध रूप से हो गया था! तो अगर आप उस स्थिति में हैं, तो यहां क्या करना है:

यह वह समस्या है जिसका मैं सामना कर रहा था:

$ git fetch origin
error: cannot lock ref 'refs/remotes/origin/fix/sub-branch': 
'refs/remotes/origin/fix' exists; cannot create 
'refs/remotes/origin/fix/sub-branch'
From <repo URL>
 ! [new branch]      fix/sub-branch          -> origin/fix/sub-branch
 (unable to update local ref)

मैंने स्वीकृत उत्तर के सुझाव की कोशिश की लेकिन यह मिल गया:

$ git push origin :fix
error: unable to delete 'fix': remote ref does not exist
error: failed to push some refs to <repo URL>

तो रेफरी भी मौजूद नहीं था origin- यह स्पष्ट रूप से मेरे स्थानीय रेपो पर कहीं न कहीं लटका हुआ था। इसलिए मैं भाग गया $ git remote show me, जो उत्पादन किया:

Remote branches:
...
refs/remotes/origin/fix             stale (use 'git remote prune' to remove)
...

जो तब समाधान स्पष्ट कर दिया:

$ git remote prune origin
Pruning origin
URL: <redacted>
 * [pruned] origin/fix

इसके साथ, समस्या गायब हो गई:

$ git fetch origin
remote: Counting objects: 5, done.
remote: Total 5 (delta 2), reused 2 (delta 2), pack-reused 3
Unpacking objects: 100% (5/5), done.
From <repo URL>
 * [new branch]      fix/sub-branch          -> origin/fix/sub-branch

3
हाँ, जैसा कि आप में भाग गया और git remote prune originइसे ठीक कर दिया। धन्यवाद!
टोड्डा

3

इसे ठीक करने के लिए इस आदेश का प्रयास करें:

git gc

वर्तमान रिपॉजिटरी के भीतर कई हाउसकीपिंग कार्यों को चलाने के लिए और अगम्य वस्तुओं को हटाकर (आह्वान git pruneकरके git fsck --unreachable)।

और पढ़ें: git help gcऔरgit help prune


2

यदि अन्य सभी विफल हो जाते हैं, तो जांच लें कि आपके रेपो सिस्टम में शाखा नामों की सीमाएँ नहीं हैं। मेरे मामले में, आप केवल ऐसी शाखाएँ बना सकते हैं जो शुरू होती हैं SD-<number>। कोई अन्य नामकरण आपको सिर्फ एक सामान्य देगा:

remote: error: cannot lock ref 'refs/heads/mybranch': 'refs/heads/mybranch/environment-variables' exists; cannot create 'refs/heads/mybranch'
To git.example.com:project/repository.git
 ! [remote rejected] mybranch -> mybranch (failed to update ref)
error: failed to push some refs to 'git@git.example.com:project/repository.git'

1
#!/usr/bin/env bash
echo "update-ref delete refs/tags"
log="git-update-ref-errors.log"
script="./git-update-ref-exist-tags-delete.sh"
git_command="git update-ref -d refs/tags"

echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors to ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}

echo fetch
log="git-fetch-errors.log"
script="./git-fetch-exist-tags-delete.sh"
git_command="git fetch"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git fetch

echo pull
log="git-pull-errors.log"
script="./git-pull-exist-tags-delete.sh"
git_command="git pull"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git pull

echo push
log="git-push-errors.log"
script="./git-push-exist-tags-delete.sh"
git_command="git push"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git push

उपरोक्त स्क्रिप्ट XXX-त्रुटियों के लिए त्रुटियों को लॉग इन करेगी। XXX-exist-tags-delete.sh को स्वचालित रूप से निम्न आदेशों का उपयोग करके XXX-exist-tags-delete.sh को जनरेट और चलाकर उन्हें ठीक करें:

  1. git अपडेट-रेफ -d refs / टैग
  2. git fetch
  3. पकड़ खींचो
  4. जोर का धक्का


1

एक विंडोज़ उपयोगकर्ता के रूप में, अब तक किसी भी समाधान ने मेरे लिए समस्या हल नहीं की है। मैं इस त्रुटि को देख रहा था क्योंकि (ओपी के शाखा नामों का उपयोग करके) मैं एक शाखा बनाने की कोशिश कर रहा था dev/subलेकिन किसी और ने एक शाखा बनाई थी जिसे कहा जाता है Devऔर जैसा कि हम सभी जानते हैं, खिड़कियों में एक केस असंवेदनशील फाइल सिस्टम है।

इसलिए जब विंडोज़ ने नीचे खींचने की कोशिश की तो dev/subवह पहली बार फ़ोल्डर बनाने की कोशिश कर रहा था dev, लेकिन ऐसा नहीं हो सका क्योंकि Devपहले से मौजूद था।

समाधान यह था कि Devशाखा को स्थानीय रूप से हटा दिया जाए और दूरस्थ रूप से हटा दिया जाए git branch -d Dev && git push origin :Dev। इसके git pullबाद ठीक चला।

एक और सबक आगे बढ़ते हुए, इस तरह के गोचा से बचने के लिए शाखा नाम हमेशा कम होना चाहिए।


1

मैं समझता हूं कि यह पहले ही उत्तर दिया जा चुका है, लेकिन इसने मेरे लिए काम नहीं किया। मैंने स्थानीय बदलावों की परवाह नहीं की क्योंकि यह पहले से ही बढ़ा हुआ था लेकिन मुद्दों को वापस खींच रहा था। मेरे मामले में, हमने "हॉटफ़िक्स" को ब्रांच के रूप में बदल दिया है, जो कि ब्रैंड सिस्टम के रूप में पैरेंट फ़ोल्डर में "हॉटफ़िक्स" के रूप में है।

- हॉटफ़िक्स ---- हॉटफ़िक्स / १२३४_बग ---- हॉटफ़िक्स / ३४५६_बग

इसलिए मुझे निम्नलिखित त्रुटि हो रही थी:

Fetching from origin Error: cannot lock ref 'refs/remotes/origin/hotfix/1234_bug': 'refs/remotes/origin/hotfix' exists; cannot create 'refs/remotes/origin/hotfix'

इसी तरह की त्रुटियों की खोज करने के बाद आखिरकार मुझे यहां एक चर्चा सूत्र पर समाधान मिला ।

git remote prune origin


0

नाम बदलें dev/subकरने के लिए dev/sub/somethingहै, तो आप शाखा बना सकते हैं dev/sub/master

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