จะบอกได้อย่างไรว่าจะให้แท็กใดชี้ไปที่ Git


410

ฉันมีแท็กที่ไม่ได้จดทะเบียนจำนวนมากในพื้นที่เก็บข้อมูลและฉันต้องการที่จะกำหนดว่าพวกเขาชี้ไปที่ใด มีคำสั่งที่จะแสดงรายการแท็กและการกระทำของพวกเขา SHA หรือไม่? การตรวจสอบแท็กและดูที่ HEAD นั้นดูลำบากสำหรับฉัน

ปรับปรุง

ฉันรู้หลังจากที่ฉันได้รับคำตอบว่าสิ่งที่ฉันต้องการคือการดูประวัติที่นำไปสู่แท็กซึ่งgit log <tagname>เพียงพอแล้ว

คำตอบที่ถูกทำเครื่องหมายว่าเป็นคำตอบนั้นมีประโยชน์สำหรับการรับรายการแท็กและความมุ่งมั่นของพวกเขาซึ่งเป็นสิ่งที่ฉันถาม ด้วยการเจาะเชลล์สักหน่อยฉันแน่ใจว่ามันเป็นไปได้ที่จะแปลงมันให้เป็นข้อความ SHA + Commit


3
ฉันต้องการจุดที่git show-refแสดง sha ของแท็กไม่ใช่ sha ของการแก้ไข repo $ คอมไพล์แสดงเตะทดสอบ 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / แท็ก / ทดสอบ $ Git ทดสอบเช็คเอาหัวเป็นตอนที่ c7f8831 ... $ Git เช็คเอาท์ 08b9c77 HEAD เป็นตอนที่ c7f8831 ...
คอนสแตนติ 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>?
Jakub Narębski

51
@ Jakub: git rev-parse $TAGส่งคืน SHA1 ของวัตถุแท็กไม่ใช่การกระทำที่ชี้ไป git rev-list -1ทำงานได้แม้ว่า
mipadi

11
@mipadi: สำหรับแท็กที่ไม่มีคำอธิบายประกอบมันไม่สำคัญ สำหรับแท็กข้อเขียนคุณสามารถใช้git rev-parse $TAG^{commit}หรือgit rev-parse $TAG^{}เพื่อ dereference ข้อเขียน / เซ็นสัญญาแท็ก
ยาคุบบNarębski

5
คุณสามารถใช้:git rev-list $TAG --max-count=1
b73

4
@RobinHsu: หากคุณมีข้อเขียนแท็กที่ถูกสร้างขึ้นด้วยgit tag -aหรือgit tag -sแล้วgit rev-parse <tag>จะให้คุณ SHA-1 ของวัตถุแท็กตัวเองในขณะที่git rev-list -1 <tag>จะให้ SHA-1 ของการกระทำ (แก้ไข) git rev-parse <tag>^{commit}จะชี้ไปเช่นเดียวกับ HTH
Jakub Narębski

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/*
Igor Zevaka

3
อืมม มันมีพฤติกรรมแปลก ๆ ในที่เก็บของฉัน: git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467474550 550; git แสดงการอ้างอิง - แท็ก -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; ดูคำตอบของ Jakub Narebski
NickSoft

6
งานนี้ แต่ฉันสงสัยว่ามันจะไม่สมเหตุสมผลที่จะgit tag --verboseแสดงให้พวกเขาเห็นด้วยเหรอ?
nonopolarity

34
สิ่งนี้จะแสดงการอ้างอิงของแท็กเองไม่ใช่การกระทำที่แท็กชี้ไป คุณต้องเพิ่มการ-dตั้งค่าสถานะเพื่อรับการอ้างอิง (ในบรรทัดที่สอง)
โปรเก่า

4
@CharlesBailey ยุติธรรมพอ แต่คำถามและคำตอบมี morphed เพื่อรวมแท็กที่มีคำอธิบายประกอบและความจริงที่ว่าgit show-refพฤติกรรมที่แตกต่างกันในแท็กสองประเภทที่แตกต่างกันไม่ชัดเจนหรือความรู้ทั่วไป
โปรเก่า

104

เพียงแค่ใช้ git show <tag>

อย่างไรก็ตามมันยังทิ้งการกระทำที่แตกต่าง จะละเว้น diffs git log -1 <tag>ผู้ใช้ (ขอบคุณ @DolphinDream และ @demisx!)


7
บน SO เมื่อคำถามมีคำตอบต่าง ๆ ที่เป็นไปได้คำตอบที่โพสต์ก่อนจะถูกโหวตขึ้นมาก่อน - วางไว้ที่ด้านบนสุดของรายการและทำให้พวกเขาเพิ่มขึ้นในภายหลัง นี่คือลูปการตอบรับแบบเอนเอียงตามความเร็วในการตอบสนองต่อคุณภาพการตอบสนอง ด้วยจินตนาการที่เพียงพอปัญหานี้สามารถแก้ไขได้
samthebest

6
"ทางออกที่ดีที่สุด" เพื่ออะไร หากความสนใจในการค้นหา SHA ของการกระทำแท็กชี้ไปที่ "git show <mytag>" ไม่ใช่ทางออกที่ดีที่สุด คำสั่งนี้จะแสดงความแตกต่างทั้งหมดที่คอมมิชชันแนะนำ สำหรับการแสดงรายการเฉพาะ SHA ของการกระทำแท็กชี้ไปที่ "git rev-list <mytag> -n 1" เป็นทางออกที่ถูกต้อง
DolphinDream

นี่ไม่ใช่คำตอบสำหรับคำถามของ OP git show <tag>แสดงให้เห็นถึงความแตกต่างไม่ใช่การกระทำแท็กชี้ไปที่
demisx

@demisx คุณกำลังพูดถึงอะไร? มันแสดงการแฮชการกระทำพร้อมกับแท็กเกอร์วันที่และข้อมูลอื่น ๆ ลองมัน.
Hlung

4
@Hlung Like @DolphinDream ชี้ให้เห็นgit showทิ้งสิ่งต่างๆมากมายบนหน้าจอที่ไม่จำเป็นต้องอยู่ที่นั่น มันปิดบังแฮชการกระทำที่แท้จริงที่กำลังมองหา คำสั่งที่ดีกว่าคือgit log -1 [tag-name]หรือgit log -1 --pretty=oneline [tag-name]ถ้าคุณต้องการผู้รุกราน
demisx

40

บนที่เก็บของฉันgit show-ref TAGแสดงแฮชของแท็กไม่ใช่แฮชของการกระทำที่ชี้ไป

git show-ref --dereference TAG นอกจากนี้การกระทำที่ถูกชี้ไปที่


34

จากIgor Zevaka :

สรุป

เนื่องจากมีคำตอบที่ยอมรับได้เกือบเท่ากัน แต่มีคำตอบที่แตกต่างกันเกือบ 4 อันฉันจะสรุปวิธีที่แตกต่างทั้งหมดในการสกินแท็ก

  1. git rev-list -1 $TAG( คำตอบ ) git rev-listส่งออกกระทำที่นำไปสู่ที่$TAGคล้ายกันgit logแต่เพียงแสดง SHA1 ของการกระทำ การ-1จำกัด การส่งออกไปยังกระทำมันชี้ไปที่

  2. git show-ref --tags( คำตอบ ) จะแสดงแท็กทั้งหมด (ภายในและดึงข้อมูลจากระยะไกล) และ SHA1

  3. git show-ref $TAG( คำตอบ ) จะแสดงแท็กและเส้นทางพร้อมกับ SHA1

  4. git rev-parse $TAG( คำตอบ ) จะแสดง SHA1 ของแท็กที่ไม่มีการแก้ไข

  5. git rev-parse --verify $TAG^{commit}( คำตอบ ) จะแสดง SHA1 ของแท็กที่ใส่คำอธิบายประกอบและไม่มีคำอธิบายประกอบ บน Windows ใช้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ที่ดูเหมือนว่าจะทำงานได้ดีและไม่จำเป็นต้องมีการหลบหนีพิเศษใน Windows (ซึ่งจำเป็นต้องใช้สี่หมวก (^) แทนที่จะเป็นหนึ่ง) ส่วนต่อท้าย~<number>จะให้ค่าคอมมิชชันหลัก <number> th ดังนั้นจึง~0ให้ค่าความมุ่งมั่น Btw ^0ยังเป็นชวเลขที่ถูกต้องสำหรับ^{commit}คำต่อท้ายการแก้ไข
อัตติลา



8

ฉันต้องการทราบวิธี "ถูกต้อง" แต่ในระหว่างนี้คุณสามารถทำได้:

git show mytag | head -1    

ด้วยหัวเรื่องที่กำหนดgit show --oneline mytag | head -1
Stphane

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หากจำเป็น

~/.gitconfig

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

4

คำตอบ post-Git-2 สั้น ๆ

ฉันรู้ว่าคำถามนี้อยู่ที่นี่มาระยะหนึ่งแล้ว และคำตอบจาก CB Bailey นั้นถูกต้อง 100%:git show-ref --tags --abbrev

ฉันชอบอันนี้ดีกว่าเนื่องจากมันใช้git tag:

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

ง่าย สั้น.

PS นามแฝงเช่นเดียวgit taglistกับคำสั่งนี้:

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

3

จากรายชื่อผู้รับจดหมาย gitนี่คือวิธีรับรายการการส่งแฮชสำหรับแท็กที่มีการยกเลิกการลงทะเบียนอัตโนมัติสำหรับแท็กที่มีคำอธิบายประกอบ:

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

2

สิ่งนี้ไม่แสดงชื่อไฟล์ แต่อย่างน้อยคุณก็จะได้ความรู้สึกของที่เก็บ

cat .git/refs/tags/*

แต่ละไฟล์ในไดเรกทอรีนั้นมีการกระทำ SHA ที่ชี้ไปที่การกระทำ


สิ่งนี้ใช้งานไม่ได้ฉันคิดว่าฉันดึงแท็กจากระยะไกล .git/packed-refsทำงานได้แม้ว่า
Igor Zevaka

2

ฉันต้องการทราบวิธีการที่ถูกต้องด้วยเช่นกัน แต่คุณสามารถมองเข้าไปใน:

$ cat .git/packed-refs 

หรือ:

$ cat .git/refs/tags/*

ขวาดังนั้นพฤติกรรมสำหรับการบรรจุและการอ้างอิง / แท็กจะแตกต่างกันบ้างการบรรจุแบบอ้างอิงเป็นไฟล์ข้อความที่มีแท็กและ SHA ในขณะที่ refs / tags / เป็นไดเรกทอรีที่มีไฟล์ข้อความตั้งชื่อตามแท็กที่ประกอบด้วย SHA ฉันคิดว่าวิธีที่เหมาะสมในการทำเช่นนี้คือด้วยตัวgit rev-listเอง
Igor Zevaka

2

นี่จะทำให้คุณได้รับแฮช SHA1 ปัจจุบัน

แฮช Commit แบบย่อ

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

กระทำการแฮช

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

1
ดูเหมือนจะไม่ทำงานในเวอร์ชันที่ฉันมี แต่git log <tag> -n 1 --pretty=%Hทำได้
Andy

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

ดังนั้นฉันจึงโหลดโฟลเดอร์ที่วางจำหน่ายซึ่งโฟลเดอร์เหล่านั้นอาจถูกตรวจสอบจากหนึ่งใน repos ที่แตกต่างกันไม่กี่แห่งและอาจจะเป็น dev, qa หรือสาขาหลักหรืออาจเป็นรุ่นที่ผลิตออกมาตรวจสอบจากแท็กและแท็กอาจ หมายเหตุประกอบหรือไม่ ฉันมีสคริปต์ที่จะดูที่โฟลเดอร์เป้าหมายและตอบกลับในรูปแบบ - ปัญหาคือ git รุ่นต่าง ๆ ส่งคืนสถานะที่แตกต่าง 'สำหรับการชำระเงินแท็ก

ดังนั้นฉันพบ git show-ref --tagsงานได้ในตอนแรกยกเว้นแท็กที่มีคำอธิบายประกอบ อย่างไรก็ตามการเพิ่ม -d เพิ่มรายการแยกต่างหากในรายการของแท็กหนึ่งรายการสำหรับแท็กส่วนอีกรายการสำหรับคำอธิบายประกอบ

ดังนั้นนี่คือแกนหลักของสคริปต์ของฉันสำหรับทุกคนที่ต้องการ: -

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}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.