Git में सबसे हाल का टैग पाने का सबसे सरल तरीका क्या है?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
उत्पादन:
a
b
c
क्या मुझे प्रत्येक टैग के डेटाइम को प्राप्त करने और उनकी तुलना करने के लिए स्क्रिप्ट लिखनी चाहिए?
Git में सबसे हाल का टैग पाने का सबसे सरल तरीका क्या है?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
उत्पादन:
a
b
c
क्या मुझे प्रत्येक टैग के डेटाइम को प्राप्त करने और उनकी तुलना करने के लिए स्क्रिप्ट लिखनी चाहिए?
जवाबों:
आप एक नज़र डाल सकते हैं git describe
, जो आप पूछ रहे हैं के करीब कुछ करता है।
--abbrev=0
निकटतम एनोटेट टैग
git describe --exact-match --abbrev=0
git describe --tags
और github रिलीज पेज में कॉम आखिरी टैग की तुलना करें
सबसे हाल का टैग पाने के लिए:
git describe --tags
सबसे हाल का एनोटेट टैग पाने के लिए:
git describe --abbrev=0
git describe
कहता है: --abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
सभी शाखाओं में नवीनतम टैग किए गए प्रतिबद्ध के टैग का उत्पादन करेगा
git describe --tags $(git rev-list --tags --max-count=1)
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ वियाम-परसेल
सबसे हाल का टैग पाने के लिए, आप यह कर सकते हैं:
$ git for-प्रत्येक-रेफरी refs / टैग --sort = -taggerdate --format = '% (refname)' --count = 1
बेशक, आप गिनती तर्क या सॉर्ट फ़ील्ड को इच्छानुसार बदल सकते हैं। ऐसा प्रतीत होता है कि आप कुछ अलग प्रश्न पूछने के लिए हो सकते हैं, लेकिन यह इस प्रश्न का उत्तर देता है क्योंकि मैं इसकी व्याख्या करता हूं।
--sort=-authordate
और --sort=authordate
।
--sort=-taggerdate
। टैग के लिए, authordate
और committerdate
खाली हैं (इसलिए सॉर्ट कुंजी के रूप में बेकार)।
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
और भी बेहतर है :)
--points-at=$SHA
आपको कमिट हैश के लिए टैग देगा।
इस बारे में कैसा है?
TAG=$(git describe $(git rev-list --tags --max-count=1))
तकनीकी रूप से, आपको आवश्यक रूप से नवीनतम टैग नहीं मिलेगा, लेकिन नवीनतम कमेंट जो टैग किया गया है, जो आपके लिए देख रहे हैं या नहीं हो सकता है।
--tags=<pattern>
में rev-list
। उदाहरण के लिए, अंतिम संस्करण टैग प्राप्त करेंgit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
आप निष्पादित कर सकते git describe --tags $(git rev-list --tags --max-count=1)
हैं: यहां बात की गई: नवीनतम टैग नाम कैसे प्राप्त करें?
git describe ...
एक पुराना टैग देता है ?!)
--abbrev=0
उत्तरों की कोशिश की और वे उस टैग के भाग को काट देते हैं जो मुझे चाहिए।
"सबसे हालिया" गिट के संदर्भ में दो अर्थ हो सकते हैं।
आप का मतलब हो सकता है, "किस टैग में समय में निर्माण की तारीख नवीनतम है", और यहां अधिकांश उत्तर उस प्रश्न के लिए हैं। आपके प्रश्न के संदर्भ में, आप टैग वापस करना चाहेंगेc
।
या आप का अर्थ हो सकता है "कौन सा टैग कुछ नामित शाखा के लिए विकास के इतिहास में सबसे करीब है", आमतौर पर जिस शाखा पर आप हैं, वह HEAD
। आपके प्रश्न में, यह टैग वापस आएगाa
।
ये अलग हो सकते हैं:
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
कल्पना कीजिए डेवलपर tag'ed Z
के रूप में v0.2
सोमवार को, और फिर tag'ed Q
के रूप में v0.1
मंगलवार को। v0.1
हाल ही में, लेकिन हैv0.2
विकास के इतिहास में HEAD के करीब है, इस मायने में कि वह जिस रास्ते पर है, वह HEAD के करीब है।
मुझे लगता है कि आप आमतौर पर इस दूसरे उत्तर को, विकास के इतिहास में करीब से चाहते हैं। आप git log v0.2..HEAD
प्रत्येक टैग के लिए आदि का उपयोग करके पता लगा सकते हैं । यह आपको HEAD पर आने वाले पथों की संख्या देता है क्योंकि पथ के बाद से समाप्त होने v0.2
वाला पथ HEAD द्वारा पीछा किया जाता है।
यहाँ एक पायथन लिपि है, जो इस जाँच को चलाने वाले सभी टैगों के माध्यम से पुनरावृति करती है, और फिर टैग पथ के परिवर्तित होने के बाद से टैग को कुछ ही दिनों में प्रिंट करता है।
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
कुछ अलग करता है, इसमें वह पहले टैग को खोजने के लिए (जैसे) HEAD से वापस ट्रैक करता है जो HEAD के इतिहास में वापस पथ पर है। Git शब्दों में, उन git describe
टैग्स की तलाश करता है जो HEAD से "पहुंच योग्य" हैं। इसलिए यह उन टैगों v0.2
को नहीं खोजेगा जो HEAD से वापस पथ पर नहीं हैं, लेकिन एक पथ जो वहां से निकला है।
git describe --tags
वर्तमान शाखा द्वारा देखे जा सकने वाले अंतिम टैग को लौटाता है
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed 's ...... '
यदि आप एक कम समय से अधिक की जरूरत है
(git वर्णन --टैग कभी-कभी गलत हैश देता है, मुझे नहीं पता कि क्यों, लेकिन मेरे लिए - max-count 2 डोंट काम)
इस प्रकार आप रिवर्स कालानुक्रमिक क्रम में नवीनतम 2 टैग नामों के साथ सूची प्राप्त कर सकते हैं, पूरी तरह से git 1.8.4 पर काम करता है। जीआईटी के पुराने संस्करणों (जैसे 1.7। *) के लिए, कोई "टैग:" आउटपुट में स्ट्रिंग नहीं है - बस पिछले सेड कॉल को हटा दें
यदि आप 2 से अधिक नवीनतम टैग चाहते हैं - इस "sed 2q" को "sed 5q" या जो भी आपको चाहिए, उसे बदल दें
तब आप आसानी से चर या टैग के लिए हर टैग नाम पार्स कर सकते हैं।
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
जहाँ %D
आसपास के ()
वर्णों को शामिल नहीं किया गया है , और sed
5 से शुरू होने वाली 5q को 4 पंक्तियों से पहले छोड़ दिया जाता है, फिर 'टैग: `और पहला', 'के बीच के सभी वर्णों को प्रिंट करता है। इसलिए ... यह मानते हुए कि टैग के अंदर कोई अल्पविराम का उपयोग नहीं किया जाता है, यह पूरी तरह से काम करता है।
सभी सुझावों में क्या गलत है ( मैथ्यू ब्रेट स्पष्टीकरण को छोड़कर , इस उत्तर पोस्ट की तारीख तक)?
जब आप इतिहास के अलग-अलग बिंदुओं पर jQuery Git इतिहास पर अन्य द्वारा आपूर्ति की गई कोई भी कमांड चलाते हैं और दृश्य टैगिंग इतिहास प्रतिनिधित्व के साथ परिणाम की जांच करते हैं (मैंने ऐसा इसलिए किया है कि आप इस पोस्ट को देखें):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
कई परियोजनाएं मेनलाइन से अलग शाखा में रिलीज़ (और इसलिए टैगिंग) करती हैं ।
इसके मजबूत कारण हैं । बस किसी भी अच्छी तरह से स्थापित जेएस / सीएसएस परियोजनाओं को देखें। उपयोगकर्ता सम्मेलनों के लिए वे DVCS में बाइनरी / मिनिफ़ाइड रिलीज़ फ़ाइलों को ले जाते हैं। स्वाभाविक रूप से प्रोजेक्ट मेंटेनर के रूप में आप अपनी मेनलाइन को कचरा बीनने के लिए इतिहास को अलग नहीं करना चाहते हैं और मेनलाइन से बाहर निर्माण कलाकृतियों के लिए प्रतिबद्ध हैं ।
चूँकि GIT DAG का उपयोग करता है न कि रैखिक इतिहास का - इसलिए दूरी मीट्रिक को परिभाषित करना कठिन है, इसलिए हम कह सकते हैं - ओह, जो मेरे लिए सबसे निकट हैHEAD
!
मैं अपनी खुद की यात्रा शुरू करता हूं (अंदर देखें, मैंने इस लंबी पोस्ट को फैंसी प्रूफ इमेज कॉपी नहीं किया है):
Git में ब्रांचिंग के संबंध में अतीत में निकटतम टैग क्या है?
वर्तमान में मेरे पास टैग और संशोधन के बीच दूरी की 4 उचित परिभाषा है और उपयोगिता में कमी के साथ:
HEAD
करने के लिए मर्ज आधार टैग के साथHEAD
मैं नहीं जानता कि सबसे छोटे रास्ते की लंबाई की गणना कैसे करें ।
स्क्रिप्ट कि के अनुसार प्रकार टैग तारीख का मर्ज आधार के बीच HEAD
और टैग:
$ git tag \
| while read t; do \
b=`git merge-base HEAD $t`; \
echo `git log -n 1 $b --format=%ai` $t; \
done | sort
यह अधिकांश परियोजनाओं पर प्रयोग करने योग्य है।
स्क्रिप्ट जो टैग्स की संख्या के अनुसार टैग्स को क्रमबद्ध करती है जो HEAD से उपलब्ध है लेकिन टैग से उपलब्ध नहीं है:
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
यदि आपके प्रोजेक्ट इतिहास में कमिट्स पर अजीब तारीखें हैं (क्योंकि रिबास या किसी अन्य इतिहास की पुनर्लेखन या कुछ मोरन BIOS बैटरी या अन्य मैजिक को बदलने के लिए भूल जाते हैं जो आप इतिहास में करते हैं) स्क्रिप्ट के ऊपर उपयोग करते हैं।
अंतिम विकल्प (के लिए तिथि टैग परवाह किए बिना की मर्ज आधार ) तिथि उपयोग के अनुसार क्रमबद्ध टैग की सूची प्राप्त करने के लिए:
$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r
ज्ञात वर्तमान संशोधन तिथि का उपयोग करने के लिए:
$ git log --max-count=1
ध्यान दें कि git describe --tags
इसका अपने मामलों में उपयोग है, लेकिन परियोजना के इतिहास में मानव अपेक्षित निकटतम टैग खोजने के लिए नहीं ।
नोट आप किसी भी संशोधन पर उपरोक्त व्यंजनों का उपयोग कर सकते हैं, बस HEAD
जो आप चाहते हैं उसके साथ बदलें !
git tag -l ac* | tail -n1
उपसर्ग "एसी" के साथ अंतिम टैग प्राप्त करें । उदाहरण के लिए, के साथ नामित टैग ac1.0.0
, या ac1.0.5
। नामित अन्य टैग 1.0.0
, 1.1.0
नजरअंदाज कर दिया जाएगा।
git tag -l [0-9].* | tail -n1
अंतिम टैग प्राप्त करें, जिसका पहला चार्ट है 0-9
। तो, पहले चार के साथ उन टैग को a-z
नजरअंदाज कर दिया जाएगा।
git tag --help # Help for `git tag`
git tag -l <pattern>
उन नामों के साथ सूची सूचीबद्ध करें जो दिए गए पैटर्न से मेल खाते हैं (या यदि कोई पैटर्न नहीं दिया गया है)। तर्कों के बिना "गिट टैग" चलाना भी सभी टैगों को सूचीबद्ध करता है। पैटर्न एक शेल वाइल्डकार्ड है (यानी, fnmatch (3) का उपयोग करके मिलान किया गया)। कई पैटर्न दिए जा सकते हैं; यदि उनमें से कोई भी मेल खाता है, तो टैग दिखाया गया है।
tail -n <number> # display the last part of a file
tail -n1 # Display the last item
के साथ git tag --help
, sort
तर्क के बारे में । यह lexicorgraphic order
डिफ़ॉल्ट रूप से उपयोग करेगा , अगर tag.sort
संपत्ति मौजूद नहीं है।
यदि यह मौजूद है, या lexicographic क्रम अन्यथा, tag.sort चर के लिए कॉन्फ़िगर किए गए मान के लिए ऑर्डर क्रम को अलग करें। Git-config (1) देखें।
Google के बाद, किसी ने कहा कि वाक्यविन्यास के बाद git 2.8.0 समर्थन करता है।
git tag --sort=committerdate
git tag --sort=committerdate | tail -1
निम्नलिखित मामलों में मेरे लिए निम्नलिखित कार्य आपको पिछले दो टैग (उदाहरण के लिए, वर्तमान टैग और पिछले टैग के बीच परिवर्तन लॉग उत्पन्न करने के लिए) की आवश्यकता है। मैंने इसे केवल उसी स्थिति में परीक्षण किया है जहां नवीनतम टैग था HEAD
।
PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`
GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`
यह मेरी आवश्यकताओं के अनुरूप है, लेकिन जैसा कि मैं कोई गिट विज़ार्ड नहीं हूं, मुझे यकीन है कि इसे और बेहतर बनाया जा सकता है। मुझे यह भी संदेह है कि अगर यह इतिहास आगे बढ़ता है तो यह टूट जाएगा। मैं सिर्फ मामले में साझा कर रहा हूं यह किसी की मदद करता है।
मेरा पहला विचार है कि क्या आप इसका उपयोग कर सकते हैं git rev-list HEAD
, जो रिवर्स कालानुक्रमिक क्रम में सभी रेव्स को सूचीबद्ध करता है, साथ में git tag --contains
। जब आप एक रेफरी पाते हैं जहां git tag --contains
एक गैर-रिक्त सूची का उत्पादन होता है, तो आपको सबसे हाल का टैग मिला है।
यदि आपको एक लाइनर की आवश्यकता है, जो वर्तमान शाखा पर नवीनतम टैग नाम (टैग तिथि द्वारा) प्राप्त करता है :
git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
हम इसका उपयोग सेटअप में संस्करण संख्या सेट करने के लिए करते हैं।
आउटपुट उदाहरण:
v1.0.0
विंडोज पर भी काम करता है।
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
) में लपेटता हूं और --points-at=HEAD
इसे काम करता हूं । उस अंतिम स्विच के साथ यह कुछ भी नहीं लौटाता है, मुझे लगता है क्योंकि मेरे HEAD
टैग नहीं है?
HEAD
टैग नहीं है।
यह एक पुराना धागा है, लेकिन ऐसा लगता है कि बहुत से लोग ओपी के सवाल का सबसे सरल, सबसे आसान और सबसे सही उत्तर याद कर रहे हैं: वर्तमान शाखा के लिए नवीनतम टैग प्राप्त करने के लिए, जिसका आप उपयोग करते हैं git describe HEAD
। किया हुआ।
संपादित करें: आप किसी भी मान्य refname की आपूर्ति कर सकते हैं, यहां तक कि रिमोट भी कर सकते हैं; यानी, git describe origin/master
आपको नवीनतम टैग बताएगा जो मूल / मास्टर से पहुंच सकता है।
for-each-ref
आदेश ( stackoverflow.com/a/5261470/515973 ) और के संयोजन rev-list
और describe
( stackoverflow.com/a/7979255/515973 )
git describe branchname --tags
मेरे लिए शाखा पर नवीनतम टैग प्राप्त करने के लिए काम करता है (git संस्करण
केवल वर्तमान शाखा / टैग नाम पर नवीनतम टैग प्राप्त करने के लिए जो वर्तमान शाखा के साथ उपसर्ग करता है, मुझे निम्नलिखित को निष्पादित करना था
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH
शाखा मास्टर:
git checkout master
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
master-1448
शाखा प्रथा:
git checkout 9.4
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
9.4-6
और मेरे अंतिम वेतन वृद्धि और अगले टैगिंग के लिए टैग +1 प्राप्त करने की आवश्यकता है।
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
पूछे गए प्रश्न के लिए,
वर्तमान शाखा में नवीनतम टैग नाम कैसे प्राप्त करें
तुम्हें चाहिए
git log --first-parent --pretty=%d | grep -m1 tag:
--first-parent
git log
किसी भी मर्ज किए गए इतिहास का विस्तार नहीं करने के लिए कहता है , --pretty=%d
केवल सजावट को दिखाने के लिए कहता है यानी किसी भी हिट के लिए स्थानीय नाम। grep -m1
"सिर्फ एक मैच" कहता है, इसलिए आपको सिर्फ सबसे हाल का टैग मिलता है।
यहाँ अनारक्षित टैग बनाम एनोटेट लोगों का अधिक उल्लेख नहीं है। एनोटेट टैग पर 'वर्णन' काम करता है और अननोनॉटेड लोगों की उपेक्षा करता है।
यह बदसूरत है, लेकिन क्या नौकरी का अनुरोध किया गया है और इसे अन्य शाखाओं पर कोई टैग नहीं मिलेगा (और कमांड में निर्दिष्ट एक पर नहीं: नीचे दिए गए उदाहरण में मास्टर)
फ़िल्टरिंग को अनुकूलित (समेकित) किया जाना चाहिए, लेकिन फिर से, यह काम करने लगता है।
git log --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1
आलोचकों का स्वागत है क्योंकि मैं अब इसे इस्तेमाल करने जा रहा हूं :)