Git में, क्या डिलीट ब्रांच के समान नाम के साथ टैग बनाना एक बुरा विचार है?


20

मैं एक git शाखाओं के मॉडल के साथ एक परियोजना है जो लगभग nvie के git-flow का अनुसरण करता है ।

हमारी रिलीज़ शाखाओं का नाम वीवीआर प्रारूप में रखा गया है , जैसेv1.5.2

एक बार एक रिलीज शाखा को उत्पादन के लिए हरी बत्ती दी जाती है, हम शाखा को बंद कर देते हैं, इसे मास्टर में विलय करके, एक टैग लागू करते हैं, और फिर शाखा को हटाते हैं।

जैसे ही हम तुरंत रिलीज़ शाखा को हटाते हैं, हम उसी पहचानकर्ता को शाखा को टैग करने के लिए उपयोग कर रहे हैं, उदाहरण के लिए v1.5.2

यहां वे कमांड हैं जिनका उपयोग हम एक रिलीज़ शाखा को बंद करने के लिए करेंगे:

$ git checkout master
$ git merge v1.5.2
$ git tag -a v1.5.2 -m "Version 1.5.2 - foo bar, baz, etc"
$ git branch -d v1.5.2
$ git branch -dr origin/v1.5.2
$ git push origin :v1.5.2
$ git push
$ git push --tags

यह अधिकांश मामलों में काम करता प्रतीत होता है, हालाँकि यह उस परिदृश्य में एक समस्या का कारण बन रहा है जहाँ git रेपो (उदाहरण के लिए एक अन्य देव मशीन, या मंचन वातावरण) का एक और उदाहरण v1.5.2 शाखा का एक स्थानीय चेकआउट है।

git push origin :v1.5.2आदेश दूरदराज में शाखा हट जाएगा, लेकिन स्थानीय (यदि वह मौजूद) सभी रेपोस में शाखा के संस्करण को नहीं हटाता।

यह v1.5.2उन संदर्भों में चेकआउट की कोशिश करते समय अस्पष्ट संदर्भ की ओर जाता है :

$ git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.

क्या शाखाओं, जैसे release-v1.5.2, या के लिए एक अलग वाक्यविन्यास का उपयोग किए बिना इसे टाला जा सकता है v1.5.2-rc?

या क्या यह अपरिहार्य है, और इसलिए एक मूल रूप से बुरा विचार एक हटाए गए शाखा के समान नाम के साथ एक टैग बनाने के लिए है?

जवाबों:


19

यदि आप इस नामकरण योजना को पूरी तरह से रखना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:

तय करें कि आप इन चेतावनियों की परवाह नहीं करते हैं

यदि आप इस तथ्य से खुश हैं कि:

  • git checkout <ref>बाहर की जाँच करेगा refs/heads/<ref>से अधिक refs/tags/<ref>(देखें Git-चेकआउट )
  • अन्य आदेशों का उपयोग होगा refs/tags/<ref>खत्म हो गया refs/heads/<ref>है (देखें gitrevisions )

उदाहरण के लिए, इस परीक्षण रिपॉजिटरी में, v1.5.2शाखा बी करने के लिए इंगित करती है, लेकिन v1.5.2टैग ए को प्रतिबद्ध करता है।

% git log --oneline --decorate
8060f6f (HEAD, v1.5.2, master) commit B
0e69483 (tag: v1.5.2) commit A

git checkout शाखा नाम पसंद करते हैं:

% git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.
Switched to branch 'v1.5.2'
% git log --decorate --oneline -1
8060f6f (HEAD, v1.5.2, master) commit B

लेकिन git logटैग नाम का उपयोग करेगा:

% git log --decorate --oneline -1 v1.5.2
warning: refname 'v1.5.2' is ambiguous.
0e69483 (tag: v1.5.2) commit A

यह भ्रामक हो सकता है।

नया टैग देखने पर लोगों को अपनी स्थानीय शाखाओं को हटाने के लिए प्रशिक्षित करें

यह आपके संगठन के आकार के आधार पर कठिन / अजीब हो सकता है।

"गिट पुल" और "गिट लाने" के आसपास एक आवरण लिखें

यही है, एक आवरण लिखें जो यह जांचता है कि क्या कोई टैग हैं जो छाया शाखा के नाम हैं, और उन शाखाओं के बारे में चेतावनी देते हैं (या हटाएं)। यह दर्दनाक लगता है, और यह अवांछनीय हो सकता है अगर छाया की गई शाखा को वर्तमान में चेक किया गया हो।

दुर्भाग्य से, यह लगता है कि इस समस्या को हल करने का सबसे आसान तरीका हो सकता है कि आप अपनी शाखाओं का नाम बदल दें। आपके द्वारा पोस्ट किया गया लिंक टैग और शाखाओं के लिए विभिन्न नामकरण योजनाओं का उपयोग करता है: यदि आप पहले से ही इस पद्धति का अनुसरण कर रहे हैं, तो इसकी नामकरण योजना को अपनाना सबसे आसान समाधान हो सकता है।


जवाब के लिए धन्यवाद। बहुत मददगार। आपकी पहली बुलेट में कहा गया है कि git checkoutएक अस्पष्ट संदर्भ होने पर शाखा पर टैग की जाँच करेंगे, हालांकि यह वह व्यवहार नहीं है जिसे मैं देख रहा हूं, रेफ: gist.github.com/tommarshall/9376724 । क्या यह कुछ और है जो गिट के अधिक आधुनिक संस्करण में बदल गया है? क्या कोई ध्वज है जिसे मैं gitconfigइस व्यवहार को प्राप्त करने के लिए सेट कर सकता हूं ?
तोमरशाल

आप सही हैं, मुझे यह पूरी तरह गलत लगा। माफ़ करना! मैंने अपना उत्तर निर्धारित कर दिया है और एक उदाहरण जोड़ा है।
बेंज

10

आप स्पष्ट रूप से निर्दिष्ट कर सकते हैं कि क्या आप पूर्ण नाम का उपयोग करके एक शाखा या एक टैग चाहते हैं:

 git checkout refs/heads/v1.5.2

या

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