कैसे बताएं कि Git में कौन से टैग बिंदु हैं?


410

मेरे पास रिपॉजिटरी में अननोनॉटेड टैग्स का एक गुच्छा है और मैं बाहर काम करना चाहता हूं जो वे इंगित करते हैं। क्या कोई ऐसा आदेश है जो केवल टैग और उनकी प्रतिबद्ध SHAs की सूची देगा? टैग की जाँच करना और HEAD को देखना मेरे लिए थोड़ा कठिन है।

अपडेट करें

मुझे महसूस होने के बाद कि मैं उन प्रतिक्रियाओं से गुज़रा, जो मैं वास्तव में चाहता था कि वह केवल उस टैग की ओर जाने वाले इतिहास को देखें, जिसके git log <tagname>लिए पर्याप्त है।

उत्तर के रूप में चिह्नित किया गया उत्तर टैग की सूची और उनके आने के लिए उपयोगी है, जो मैंने पूछा है। शेल हैक के एक बिट के साथ, मुझे यकीन है कि यह SHA + प्रतिबद्ध संदेश में बदलना संभव है।


3
मैं यह git show-refबताना चाहता हूं कि टैग के बारे में पता चलता है, न कि रेपो संशोधन का। $ Git शो-रेफरी परीक्षण 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / टैग / परीक्षण $ Git चेकआउट परीक्षण सिर अब c7f8831 पर है ... $ Git चेकआउट 08b9c77 प्रमुख c7f8831 पर अब है ...
Konstantin Pelepelin

यदि आपके टैग एनोटेट हैं, तो आपको जरूरत है--dereference
ट्रेवर बॉयड स्मिथ

जवाबों:


347

ऐसा करने का एक तरीका होगा git rev-list। निम्नलिखित एक टैग अंक के लिए प्रतिबद्ध है जो उत्पादन करेगा:

$ git rev-list -n 1 $TAG

आप इसे एक उपनाम के रूप में जोड़ सकते हैं ~/.gitconfigयदि आप इसे बहुत उपयोग करते हैं:

[alias]
  tagcommit = rev-list -n 1

और फिर इसके साथ कॉल करें:

$ git tagcommit $TAG

30
उपयोग क्यों नहीं git rev-parse <tag>? या git rev-list -1 <tag>?
याकूब नारबस्की

51
@ जैकब: git rev-parse $TAGटैग ऑब्जेक्ट के SHA1 को लौटाता है, न कि वह जिसके लिए कमिट करता है। git rev-list -1हालांकि काम करता है।
मिपाड़ी

11
@mipadi: अन-एनोटेट टैग्स के लिए यह बहुत मायने नहीं रखता था; एनोटेट टैग के लिए आप उपयोग कर सकते हैं git rev-parse $TAG^{commit}या git rev-parse $TAG^{}
डीरेलमेंट

5
आप उपयोग कर सकते हैं:git rev-list $TAG --max-count=1
b73

4
@RobinHsu: यदि आपने टैग्स को एनोटेट किया है , जो कि के साथ बनाया गया है , git tag -aया git tag -sफिर git rev-parse <tag>आपको स्वयं एक टैग ऑब्जेक्ट काgit rev-list -1 <tag> SHA-1 देगा , जबकि वह SHA-1 को कमिट (संशोधन) देगा, यह उसी तरह इंगित करता है git rev-parse <tag>^{commit}। HTH।
याकूब नारबस्की

240
git show-ref --tags

उदाहरण के लिए, git show-ref --abbrev=7 --tagsआपको निम्न जैसा कुछ दिखाई देगा:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2

इसके लिए धन्यवाद, यह वास्तव में या तो देखने के शब्दार्थ को छिपाता है .git/packed-refsया.git/refs/tags/*
इगोर ज़ेवाका

3
हममम। यह मेरे भंडार में अजीब व्यवहार करता है: git टैग -a v0.1.1- अल्फा a9dcc1f24cacde535523bddc22f4c69467428550; git show-Ref --tags -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; देखें जैकब नारेबस्की का उत्तर
निकोफ्ट

6
यह काम करता है, हालांकि मुझे आश्चर्य है कि यह git tag --verboseभी उन्हें दिखाने के लिए समझ में नहीं आता है?

34
यह टैग के स्वयं को दिखाएगा, न कि टैग को इंगित करता है। -dसंदर्भित संदर्भ (दूसरी पंक्ति में) प्राप्त करने के लिए आपको ध्वज जोड़ने की आवश्यकता है ।
ओल्ड प्रो

4
@CharlesBailey, काफी उचित है, लेकिन सवाल और जवाब में एनोटेट टैग शामिल करने के लिए रूपांतरित किया git show-refगया है और दो अलग-अलग प्रकार के टैग पर अलग-अलग व्यवहार करने वाले तथ्य स्पष्ट या सामान्य ज्ञान नहीं हैं।
ओल्ड प्रो

104

महज प्रयोग करें git show <tag>

हालाँकि, यह भी डंप प्रतिबद्ध अंतर है। उन भेदों को छोड़ना, उपयोग करना git log -1 <tag>। (@DolphinDream और @demisx को धन्यवाद!)


7
SO पर, जब किसी प्रश्न के कई अलग-अलग संभावित उत्तर होते हैं, तो जो उत्तर पोस्ट किए जाते हैं, वे पहले उठ जाते हैं - उन्हें सूची में सबसे ऊपर रखते हैं, और इस प्रकार उन्हें बाद में अधिक बढ़ाते हैं। यह प्रतिक्रिया की गुणवत्ता पर प्रतिक्रिया की गति पर आधारित एक पूर्वाग्रह प्रतिक्रिया पाश है। पर्याप्त कल्पना के साथ इस समस्या को ठीक किया जा सकता है।
samthebest

6
"सबसे अच्छा समाधान" किस लिए? यदि रुचि कमिटमेंट के SHA को "git show <mytag>" के टैग बिंदुओं का पता लगाने में है, तो यह सबसे अच्छा समाधान नहीं है। यह कमांड पूरी तरह से अलग-अलग प्रतिबद्धताओं को दिखाएगा। केवल कमिटमेंट के SHA को टैग करने के लिए टैग "git rev-list <mytag> -n 1" सही बिंदु है।
डॉल्फिनड्रीम

यह ओपी के सवाल का जवाब नहीं है। git show <tag>टैग को इंगित करता है, न कि टैग को इंगित करता है।
डेविक्स

@demisx आप किस बारे में बात कर रहे हैं ?? यह निश्चित रूप से टैग, दिनांक और अन्य जानकारी के साथ कमिट हैश दिखाता है। कोशिश करो।
११:१४ बजे ह्लंग

4
@Hlung @DolphinDream ने बताया git showकि स्क्रीन पर बहुत अधिक सामान डंप करता है जिसे वहां होने की आवश्यकता नहीं है। यह वास्तविक कमिट हैश की तलाश करता है। एक बेहतर आदेश है git log -1 [tag-name]या git log -1 --pretty=oneline [tag-name]यदि आप oneliners चाहते हैं।
17

40

मेरी रिपॉजिटरी पर, git show-ref TAGटैग के हैश को दिखाता है, न कि कमिट के हैश को इंगित करता है।

git show-ref --dereference TAG दिखाता है, इसके अलावा, कमिट पर इशारा किया जा रहा है।


34

से इगोर Zevaka :

सारांश

चूंकि लगभग 4 समान रूप से स्वीकार्य हैं, फिर भी अलग-अलग उत्तर हैं, मैं एक टैग को स्किन करने के सभी अलग-अलग तरीकों को संक्षेप में बताऊंगा।

  1. git rev-list -1 $TAG( उत्तर )। git rev-listआउटपुट कमिट करता है जो लीड के $TAGसमान होता है git logलेकिन केवल कमिट का SHA1 दिखा रहा है। -1उत्पादन को सीमित करता है प्रतिबद्ध करने के लिए उस पर इंगित करता है।

  2. git show-ref --tags( उत्तर ) सभी टैग (स्थानीय और दूरस्थ से प्राप्त) और उनके SHA1s दिखाएगा।

  3. git show-ref $TAG( उत्तर ) SHA1 के साथ टैग और उसका रास्ता दिखाएगा।

  4. git rev-parse $TAG( उत्तर ) किसी अज्ञात टैग के SHA1 को दिखाएगा।

  5. git rev-parse --verify $TAG^{commit}( उत्तर ) एनोटेट और अननोटेटेड टैग दोनों का SHA1 दिखाएगा। विंडोज उपयोग git rev-parse --verify %TAG%^^^^{commit}(चार टोपी) पर।

  6. cat .git/refs/tags/*या cat .git/packed-refs( उत्तर ) इस पर निर्भर करता है कि टैग स्थानीय है या दूरस्थ से लाया गया है या नहीं।


33

उपयोग

git rev-parse --verify <tag>^{commit}

(जो एनोटेट टैग के लिए भी कमिट का SHA-1 लौटाएगा)।


git show-ref <tag><tag>एनोटेट नहीं होने पर भी काम करेगा । और हमेशा होता है git for-each-ref(विवरण के लिए प्रलेखन देखें)।


11
मैं पसंद git rev-parse <tag>~0करता हूं जो काम भी करता है, और विंडोज पर कोई विशेष भागने की आवश्यकता नहीं है (जिस पर एक के बजाय चार टोपी (^) आवश्यक हैं)। प्रत्यय ~<number><संख्या> वें अभिभावक को देता है, इसलिए ~0वह प्रतिबद्ध होता है। Btw, ^0भी ^{commit}संशोधन प्रत्यय के लिए एक वैध आशुलिपि है ।
अत्तिला



8

मैं "सही" तरीका भी जानना चाहूंगा, लेकिन इस बीच, आप यह कर सकते हैं:

git show mytag | head -1    

प्रतिबद्ध शीर्षक के साथgit show --oneline mytag | head -1
स्टीफन

7

हालांकि यह बहुत पुराना है, मैंने सोचा था कि मैं एक शांत सुविधा को इंगित करूंगा जो मुझे केवल कमिट्स के साथ टैग करने के लिए मिला है:

git log --decorate=full

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


4

आप और अधिक आसानी से व्याख्या करने वाली तस्वीर प्राप्त कर सकते हैं जहां टैग उपयोग करने की ओर इशारा करते हैं

git log --graph |git name-rev --stdin --tags |less

और फिर उस टैग पर स्क्रॉल करें जिसे आप ढूंढ रहे हैं /

अधिक कॉम्पैक्ट दृश्य ( --pretty=oneline) प्लस सभी सिर ( -a) भी मदद कर सकते हैं:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

थोड़ा भयानक लग रहा है, लेकिन ~/.gitconfigयदि आवश्यक हो तो भी aliased किया जा सकता है।

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

4

शॉर्ट पोस्ट- Git-2 उत्तर

मुझे पता है कि यह सवाल काफी समय से यहाँ है। और सीबी बेली का उत्तर 100% सही है:git show-ref --tags --abbrev

मुझे यह पसंद है क्योंकि यह बेहतर है git tag:

git tag --list --format '%(refname:short) %(objectname:short)'

सरल। कम।

git taglistइस आदेश के साथ पुनश्च उर्फ :

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"

3

से Git मेलिंग सूची है, यहाँ जिस तरह से एनोटेट टैग के लिए स्वत: dereferencing साथ टैग के लिए हैश प्रतिबद्ध की सूची प्राप्त करने के लिए है:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

2

यह फ़ाइल नाम नहीं दिखाता है, लेकिन कम से कम आपको रिपॉजिटरी का एहसास मिलता है।

cat .git/refs/tags/*

उस निर्देशिका की प्रत्येक फ़ाइल में एक प्रतिबद्ध SHA होता है जो एक कमिट की ओर इशारा करता है।


यह काम नहीं किया, मुझे लगता है, मैंने रिमोट से टैग खींच लिए हैं। .git/packed-refsहालांकि काम किया।
इगोर ज़ेवाका

2

मैं भी सही तरीका जानना चाहता हूँ , लेकिन आप हमेशा या तो झाँक सकते हैं:

$ cat .git/packed-refs 

या:

$ cat .git/refs/tags/*

ठीक है, इसलिए पैक्ड-रेफ और रेफ / टैग के लिए व्यवहार कुछ अलग है, पैक्ड-रेफ एक टेक्स्ट फाइल है जिसमें टैग और SHAs होते हैं, जबकि refs / टैग / एक निर्देशिका होती है जिसमें टेक्स्ट फाइलों के साथ SHA युक्त टैग होता है। मुझे वास्तव में लगता है कि ऐसा करने का उचित तरीका है git rev-list
इगोर ज़ेवका डे

2

यह आपको वर्तमान SHA1 हैश मिलेगा

संक्षिप्त प्रतिबद्ध हैश

git show <tag> --format="%h" --> 42e646e

कमेट हश

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

1
मेरे पास जो संस्करण है, उसमें काम नहीं करता, लेकिन git log <tag> -n 1 --pretty=%Hकरता है
एंडी

2

यदि आप टैग SOMETAG (टैगर, तिथि, आदि) का विवरण देखना चाहते हैं, तो प्रतिबद्ध का हैश यह इंगित करता है और कमिट के बारे में थोड़ी जानकारी देता है लेकिन पूर्ण भिन्नता के बिना, प्रयास करें

git show --name-status SOMETAG

उदाहरण आउटपुट:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....

0

इसलिए मेरे पास रिलीज़ फ़ोल्डर्स का लोड है, जहाँ उन फ़ोल्डरों को कुछ अलग रिपॉजिट में से एक से चेक किया जा सकता है, और देव, क्यूए या मास्टर ब्रांच हो सकते हैं या प्रोडक्शन रिलीज़ हो सकते हैं, एक टैग से चेक आउट हो सकता है, और टैग हो सकता है एनोटेट या नहीं। मेरे पास एक स्क्रिप्ट है जो लक्ष्य फ़ोल्डर को देखेगा और फॉर्म में एक उत्तर वापस मिलेगा -। समस्या टैग के चेकआउट के लिए git रिटर्न के अलग-अलग स्टेटस 'के विभिन्न संस्करण हैं।

इसलिए मैंने git show-ref --tagsएनोटेट टैग को छोड़कर, शुरू में काम किया। हालाँकि -d को जोड़ने से टैग की सूची में एक अलग प्रविष्टि जोड़ी गई, टैग के लिए एक, एनोटेशन के लिए दूसरा (एनोटेशन कमिटमेंट को ^ {} के रूप में पहचाना गया था जिसे मैंने sed के साथ हटा दिया था)।

तो यह मेरी स्क्रिप्ट का मूल है, जो कोई भी इसे चाहता है: -

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi

0

नीचे उपयोग कर सकते हैं, यह प्रतिबद्ध हैश देगा
git show -s --format=%H <tag>^{commit}

यदि संक्षिप्त प्रतिबद्ध हैश की आवश्यकता है, git show -s --format=%h <tag>^{commit}

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