यदि कोई ऐसा भंडार है, जिसकी git://
पहुँच मेरे पास है (और आमतौर पर सिर्फ पुश + पुल होगा), तो क्या उस भंडार में शाखाओं का नाम बदलने का एक तरीका है जिस तरह से मैं स्थानीय स्तर पर करूँगा git branch -m
?
यदि कोई ऐसा भंडार है, जिसकी git://
पहुँच मेरे पास है (और आमतौर पर सिर्फ पुश + पुल होगा), तो क्या उस भंडार में शाखाओं का नाम बदलने का एक तरीका है जिस तरह से मैं स्थानीय स्तर पर करूँगा git branch -m
?
जवाबों:
आपको केवल वांछित नाम के साथ एक नई स्थानीय शाखा बनानी है, इसे अपने रिमोट पर धकेलें, और फिर पुरानी दूरस्थ शाखा को हटा दें:
$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name
फिर, पुराने शाखा नाम को देखने के लिए, रिपॉजिटरी के प्रत्येक ग्राहक को करना होगा:
$ git fetch origin
$ git remote prune origin
नोट: यदि आपकी पुरानी शाखा आपकी मुख्य शाखा है, तो आपको अपनी मुख्य शाखा सेटिंग्स बदलनी चाहिए। अन्यथा, जब आप दौड़ते हैं $ git push origin :old-branch-name
, तो आपको "वर्तमान शाखा निषिद्ध हटाने" की त्रुटि मिलेगी ।
git fetch origin --prune
(प्रभावी रूप से नई शाखाओं को लाने के लिए और रिमोट पर अब संदर्भों से छुटकारा पाने के लिए)।
-d
या --delete
इसके बजाय कर सकते हैं :
।
यदि आप वास्तव में एक ही समय में किसी भी स्थानीय शाखाओं का नाम लिए बिना दूरस्थ रूप से शाखाओं का नाम बदलना चाहते हैं , तो आप एकल कमांड के साथ ऐसा कर सकते हैं:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
मैंने यह स्क्रिप्ट ( git-rename-रिमोट-ब्रांच ) लिखी है जो उपरोक्त आसानी से करने के लिए एक आसान शॉर्टकट प्रदान करती है।
एक समारोह के रूप में:
git-rename-remote-branch(){
if [ $# -ne 3 ]; then
echo "Rationale : Rename a branch on the server without checking it out."
echo "Usage : $(basename $0) <remote> <old name> <new name>"
echo "Example : $(basename $0) origin master release"
exit 1
fi
git push $1 $1/$2:refs/heads/$3 :$2
}
@ Ksrb की टिप्पणी को एकीकृत करने के लिए : यह मूल रूप से एक ही कमांड में दो पुश करता है, पहले git push <remote> <remote>/<old_name>:refs/heads/<new_name>
पुराने रिमोट ट्रैकिंग शाखा पर आधारित एक नई रिमोट शाखा को पुश करने के लिए और फिर git push <remote> :<old_name>
पुरानी रिमोट शाखा को हटाने के लिए।
git push <remote>/<old_name>:refs/heads/<new_name>
मतलब है एक नया रिमोट धक्का जो src के रूप में पुराने रिमोट का उपयोग करता है तो git push [space]:<old_name>
इसका मतलब है कि पुराने रिमोट को हटा दें
refs/heads/name
? क्या आप केवल name
पहली कमांड बनाते हुए सीधे उपयोग नहीं कर सकते git push <remote> <remote>/<old_name>:<new_name>
?
<new_name>
अभी तक मौजूद नहीं है। यदि शाखा मौजूद नहीं है, तो गिट को आपको पूर्ण नाम का उपयोग करने की आवश्यकता होती है, अन्यथा <new_name>
टैग नाम का भी उल्लेख कर सकते हैं।
refs/heads/<new_name>
पहले से ही मौजूद हैं , तो केवल चेतावनी । हटाना अभी भी सफल है, जिसके परिणामस्वरूप <remote>/<old_name>
केवल हटाया जा रहा है। हाथ से पहले कुछ जाँच आसानी से इससे बच सकते हैं।
पहले उस शाखा का चेकआउट करें जिसका आप नाम बदलना चाहते हैं:
git branch -m old_branch new_branch
git push -u origin new_branch
से एक पुरानी शाखा को हटाने के लिए remote
:
git push origin :old_branch
git push -u origin new_branch
) के साथ ट्रैक करने के लिए इसके अपस्ट्रीम को भी सेट करना चाहिए अन्यथा नामांकित शाखा (new_branch) मूल (old_branch) को ट्रैक करना जारी रखेगी। और जब आप दूरस्थ old_branch को हटा देते हैं, तो new_branch अभी भी मूल / old_branch को ट्रैक करेगा, यद्यपि अब वह शाखा समाप्त हो चुकी है।
ज़रूर। बस स्थानीय रूप से शाखा का नाम बदलें, नई शाखा को धक्का दें, और पुराने को हटा दें।
एकमात्र वास्तविक मुद्दा यह है कि रिपॉजिटरी के अन्य उपयोगकर्ताओं का नाम बदलकर स्थानीय ट्रैकिंग शाखा नहीं होगी।
एक दूरस्थ शाखा का "नामकरण" वास्तव में एक 2 कदम प्रक्रिया है (जरूरी नहीं कि आदेश दिया गया हो):
git push [space]:<old_name>
को हटाना ( जैसा कि ksrb समझाया गया है );मैं TortoiseGit का उपयोग करता हूं और जब मैंने पहली बार कमांड लाइन के माध्यम से शाखा को हटाने की कोशिश की, तो मुझे यह मिला:
$ git push origin :in
घातक: 'उत्पत्ति' एक गैट भंडार के रूप में प्रकट नहीं होता है
घातक: दूरस्थ भंडार से नहीं पढ़ सकता था।
कृपया सुनिश्चित करें कि आपके पास सही एक्सेस अधिकार हैं और रिपॉजिटरी मौजूद है।
इस संभावना की वजह से था तमाशा नहीं होने निजी कुंजी (जो लोड TortoiseGit भार में स्वचालित रूप से तमाशा )। इसके अलावा, मैंने देखा कि TortoiseGit कमांड में origin
रेफरी नहीं है (जैसे git.exe push --progress "my_project" interesting_local:interesting
)।
मैं Bitbucket और अन्य वेब-आधारित ऑनलाइन गिट प्रबंधकों (GitHub, GitLab) के वेब प्रबंधकों के रूप में भी उपयोग कर रहा हूं, मैं उनके इंटरफ़ेस (शाखाओं पृष्ठ) के माध्यम से सीधे दूरस्थ शाखा को हटाने में सक्षम था:
हालाँकि, TortoiseGit में आप ब्राउज़ संदर्भ के माध्यम से दूरस्थ शाखाओं को भी हटा सकते हैं :
किसी दूरस्थ शाखा पर राइट-क्लिक करके (सूची को हटाता है) दूरस्थ शाखा को हटाएं विकल्प दिखाता है:
पुरानी दूरस्थ शाखा को हटाने के बाद मैंने सीधे कछुआगेट के माध्यम से एक नई दूरस्थ शाखा में धकेल दिया, रिमोट का नया नाम टाइप करके : पुश विंडो का क्षेत्र और यह शाखा स्वचालित रूप से बनाई गई थी और बिटबकेट में दिखाई दे रही थी ।
हालांकि, अगर आप अभी भी इसे मैन्युअल रूप से करना पसंद करते हैं, तो एक बिंदु जिसका अभी तक इस धागे में उल्लेख नहीं किया गया है, वह है -u
= --set-upstream
।
से git push
डॉक्स , -u
बस का एक अन्य नाम है --set-upstream
, के जवाब में इतना आदेशों सिल्वेन (-set-upstream new-branch
) और शशांक ( -u origin new_branch
) , बराबर हैं दूरदराज के रेफरी के बाद से चूक करने के लिएorigin
, अगर कोई अन्य रेफरी पहले से परिभाषित किया गया है:
git push origin -u new_branch
= git push -u new_branch
से डॉक्स विवरण :
यदि कॉन्फ़िगरेशन अनुपलब्ध है, तो यह करने के लिए डिफ़ॉल्ट है
origin
।
अंत में, मैंने अन्य उत्तरों द्वारा सुझाए गए आदेशों में से कोई भी मैन्युअल रूप से टाइप या इन का उपयोग नहीं किया, इसलिए शायद यह एक समान स्थिति में दूसरों के लिए उपयोगी हो सकता है।
origin
। कमांड चलाने से आपको अपने रिमोट का नाम देना होगा git remote
। Git से ssh
तात्पर्य है कि आप सार्वजनिक + निजी कुंजी का उपयोग कर रहे हैं। मुझे लगता है कि Autoload Putty keys
TortoiseGit की बस आपके दूरस्थ संदर्भ के साथ कुछ भी करने के लिए आपके लिए आवश्यक कुंजी स्वतः पूर्ण कर रही है। अंतिम बात यह है कि git push -u
दूरस्थ शाखा में धकेलने के लिए एक उपनाम नहीं है, यह एक दूरस्थ शाखा में धकेलने के लिए एक उपनाम है जिसे स्थानीय रूप से बनाया गया था और इसका दूरस्थ संदर्भ अभी तक इस शाखा में नहीं है ।
-u
का एक उपनाम है --set-upstream
और "यदि कॉन्फ़िगरेशन गायब है, तो यह चूक हैorigin
"। सिल्वेन और शशांक इसका उपयोग नव निर्मित रिमोट शाखा में धकेलने के लिए करते हैं । जब मैंने शेल पर कोशिश की तो पेजेंट के लोड नहीं होने के कारण यह महत्वपूर्ण मुद्दा हो सकता है । इसलिए मैं आपके पतन को नहीं समझता, मैंने केवल अन्य उत्तरों में मेरा और गैर-संबोधित विवरणों को इंगित किया, उन्हें समझाया और उन्हें हल किया। git push origin :in
-u
लिए एक उपनाम है --set-upstream
लेकिन यह एक दूरस्थ शाखा में धकेलने के लिए एक उपनाम नहीं है जैसा आपने कहा था। एक दूरस्थ शाखा में जाने के लिए जिसकी आपको विशिष्ट आवश्यकता है git push <remote>
, और यदि यह अभी तक दूरस्थ में नहीं है, तो आप जोड़ते हैं git push -u <remote>
। इसलिए, -u
रिमोट में शाखा का एक संदर्भ बनाने के लिए उपयोग किया जाता है।
मुझे पता नहीं क्यों लेकिन @ सिल्वेन डिफ्रेंस का जवाब मेरे लिए कारगर नहीं है।
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
मुझे अपस्ट्रीम को अनसेट करना होगा और फिर मैं स्ट्रीम को फिर से सेट कर सकता हूं। निम्नलिखित यह है कि मैंने इसे कैसे किया।
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
मुझे नहीं पता कि यह सही है या गलत है, लेकिन मैंने शाखा के "पुराने नाम" को शाखा के "नए नाम" पर धकेल दिया, फिर पुरानी शाखा को निम्नलिखित दो पंक्तियों के साथ पूरी तरह से हटा दिया:
git push origin old_branch:new_branch
git push origin :old_branch
पहले से दिए गए उत्तरों को जोड़ते हुए, यहां एक संस्करण दिया गया है जो पहले जांचता है कि क्या नई शाखा पहले से मौजूद है (इसलिए आप इसे स्क्रिप्ट में सुरक्षित रूप से उपयोग कर सकते हैं)
if git ls-remote --heads "$remote" \
| cut -f2 \
| sed 's:refs/heads/::' \
| grep -q ^"$newname"$; then
echo "Error: $newname already exists"
exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"
(जाँच इस उत्तर से है )
git show-ref --quiet --verify -- refs/heads/$new_name
इसके बजाय इस्तेमाल किया होता ls-remote | cut | sed | grep
।
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
:।