2010-10-05 13 views
28

मुझे गिट कमांड की आवश्यकता को अंतिम संस्करण प्राप्त करने के लिए 'v' से शुरू होने वाला अंतिम टैग प्राप्त करें/मैं अगले एप्लिकेशन संस्करण को टैग करने के लिए शुरुआत में वी पत्र के साथ टैग का उपयोग कर रहा हूं (उदाहरण: v0.9.1beta)अंतिम गिट टैग मिलान रेगेक्स मानदंड

वहाँ यह करने के लिए कोई तरीका है

+1

तुम सिर्फ इस्तेमाल कर सकता हूँ 'Git describe'? – Daenyth

+0

हाँ .. गिट वर्णन - मैच वी * जो मुझे चाहिए था। धन्यवाद। – Lukasz

+1

क्या कोई शीर्षक संपादित कर सकता है, क्योंकि इसके लिए वास्तव में रेगेक्स का उपयोग करने की आवश्यकता नहीं है। इसके अलावा सभी जवाब सिर्फ मैच और "ग्लोब" पैटर्न का उपयोग करते हैं। धन्यवाद। – d4Rk

उत्तर

39

मैं इस के लिए निम्न आदेश का उपयोग कर रहा:।?

git describe --match "v[0-9]*" --abbrev=4 HEAD 

यदि आपने अपने अंतिम संस्करण वाले टैग के बाद स्रोत पेड़ के साथ कुछ किया है तो यह संस्करण को भी संशोधित करेगा।

कृपया ध्यान दें कि यह एक रेगेक्स नहीं बल्कि एक ग्लोब है लेकिन प्रदान किए गए उदाहरण के लिए काम करता है।

+2

यदि आप चाहते हैं कि टैग '--abbrev = 0' के साथ "लघु आउटपुट" का उपयोग करें। –

+3

['git वर्णन 'डॉक्टर] (https://git-scm.com/docs/git-describe) कहता है कि' --match' एक ग्लोब लेता है, रेगेक्स नहीं। –

+0

@CraigMcQueen जो एक ग्लोब है, और यही कारण है कि यह काम कर रहा है और 'v1.0.0' को फ़िल्टर करता है और न केवल 'v1234'। मैंने इसे स्पष्ट करने के लिए एक नोट जोड़ा। –

4
git tag -l -n v* 
+2

यह सभी टैग मिलान मानदंडों को सूचीबद्ध करता है। मुझे केवल अंतिम की आवश्यकता है, इसलिए गिट वर्णन - मैच v *। वैसे भी टैग के रूप में संकेतों के लिए धन्यवाद और वर्णन कमांड गिट मैनुअल पृष्ठों पर एक साथ जुड़े हुए हैं। – Lukasz

2
git describe --match v* 

इसका उपयोग करें।

+1

इसमें सभी टैग 'v' के साथ शुरू होंगे, इसलिए यह सभी सूचीबद्ध करेगा शब्द न केवल –

+0

हाँ ... यह सच है। वैसे भी मैंने आपके प्रश्न को हल करने के रूप में आपके रेगेक्स को ध्वजांकित किया। क्या मुझे यह जवाब हटाना चाहिए? स्वीकृति के लिए – Lukasz

+0

धन्यवाद! नहीं, मुझे लगता है कि इस जवाब को हटाने की जरूरत नहीं है। –

0

मैं उपयोग

git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*" 

git tag ग्लोब के रूप में पैटर्न व्याख्या करता है। तो आप एक पूर्ण उड़ा regex निर्दिष्ट नहीं कर सकते हैं। बस एक न्यूनतम ग्लोब (वी *) या यहां तक ​​कि कोई ग्लोब का उपयोग करें। आपको क्रमबद्ध क्रम में केवल एक मिलान करने वाला टैग प्राप्त होगा (पहले उच्चतम टैग संस्करण) और आप बाद में आउटपुट को पुनः प्राप्त करने में सक्षम होंगे।

3

KARASZI István's answer पहले से ही बताता है कि ग्लोब से मेल खाने वाले टैग कैसे ढूंढें, जो आमतौर पर पर्याप्त है। क्या तुमने कभी एक असली RegEx हालांकि ज़रूरत है:

for tag in $(git tag | grep YOURREGEX); do 
    git describe --tags --long --match="$tag" 2>/dev/null 
done | sort -k2 -t"-" | head -n1 
  • आप केवल निकटतम टैग चाहते हैं (यानी क्या --abrev=0 को प्राप्त होता है), | cut -d"-" -f1
  • संलग्न आप --long के व्यवहार नहीं करना चाहते हैं को मिलान करने वाले टैग को -0-hash भाग सहित मिलान करने के लिए, | sed -e's/-0-.*$//' इसके बजाय संलग्न करें।

सवाल का उदाहरण टैग शायद एक Regex ^v\d+\.\d+\.\d+\D*$ का प्रयोग करेंगे (हालांकि \D*$ वैकल्पिक हो सकता है)।

+0

... हालांकि यह प्रदर्शन के संदर्भ में स्पष्ट रूप से खराब है, क्योंकि 'git description' regEx से मेल खाने वाले _each_ टैग के लिए चलाया जाता है। –

+0

इस के लिए धन्यवाद :) –

2

जबकि एक regex --match "v[0-9]*" यहाँ पर्याप्त है, पता है कि Git 2.13 (Q2 2017) कि सुधार होगा:

"git describe" और "git name-rev" एक से अधिक refname पैटर्न लेने के लिए सिखाया गया है प्रतिबंधित करने के लिए अपने नामकरण आउटपुट को आधार देने के लिए रेफरी का सेट, और नकारात्मक पैटर्न को नाम रेफरी भी लेना सीखा है, जिसका उपयोग उनके "--exclude" विकल्प के माध्यम से नामकरण के लिए नहीं किया जाना चाहिए।

Jacob Keller (jacob-keller) द्वारा commit 77d21f2, commit 43f8080, commit 96415b4, commit 290be66, commit 4a68748 (18 जनवरी 2017) देखें।
(commit 1b32498 में Junio C Hamano -- gitster -- द्वारा विलय, 27 फ़र 2017)

अब आप कर सकते हैं multiple match pattern:

--match <pattern>: 

केवल दिया glob(7) पैटर्न मिलान टैग, "refs/टैग हटाने पर विचार करें/"उपसर्ग।
इसका उपयोग भंडार से निजी टैग लीक करने से बचने के लिए किया जा सकता है।

यदि कई बार दिया गया है, पैटर्न की एक सूची जमा की जाएगी, और किसी भी पैटर्न से मेल खाने वाले टैग पर विचार किया जाएगा।
पैटर्न की सूची को साफ़ और रीसेट करने के लिए --no-match का उपयोग करें।

और आपके पास exclude pattern (or several) now भी है!

--exclude <pattern>:: 

दिया glob(7) पैटर्न मिलान टैग पर विचार न करें, "refs/टैग /" उपसर्ग को छोड़कर।

इसका उपयोग टैग स्पेस को संकीर्ण करने और कुछ सार्थक मानदंडों से मेल खाने वाले टैग ढूंढने के लिए किया जा सकता है।
यदि कई बार दिया गया है, पैटर्न की एक सूची जमा की जाएगी और किसी भी पैटर्न से मेल खाने वाले टैग को बाहर रखा जाएगा।
--match के साथ संयुक्त होने पर एक टैग पर विचार किया जाएगा जब यह कम से कम एक --match पैटर्न से मेल खाता है और --exclude पैटर्न से मेल नहीं खाता है।
पैटर्न की सूची को साफ़ और रीसेट करने के लिए --no-exclude का उपयोग करें।

1

अन्य उत्तर के रूप में git describe का उपयोग कर के साथ समस्या यह है कि git describe आप टैग कि सिर से पहुंचा जा सकता है दिखाएगा (या आपके द्वारा निर्दिष्ट करते हैं।)

कल्पना कीजिए कि आप 3 टैग, V1, V2 है, और v3। यदि HEAD v2 और v3 के बीच एक बिंदु पर है, git describe v3 के बजाय v2 वापस करेगा।

यदि आप वास्तव में नवीनतम टैग चाहते हैं, तो सबसे पहले आपको एनोटेटेड टैग की आवश्यकता होती है क्योंकि हल्के टैग के पास कोई मेटाडेटा नहीं है।

तो इस आदेश को यह करना होगा:

git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*

संबंधित मुद्दे