รับเวลาและวันที่ของแท็กคอมไพล์


94

ฉันมีโปรเจ็กต์ที่ใช้ git และติดแท็กทุกรุ่นด้วยแท็ก

$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.3
v1.1.0

เป้าหมายของฉันคือแสดงรายการรุ่นและวันที่เผยแพร่ในอินเทอร์เฟซเว็บ (แท็ก / วันที่กำหนด = วันที่เผยแพร่) git tagขณะนี้เรารายการทุกรุ่นที่ออกโดยใช้

ฉันจะทราบเวลาและวันที่ที่แท็กถูกสร้างขึ้นได้อย่างไร (หรือการคอมมิตที่ชี้ไป)


2
เป็นเรื่องดีที่จะระบุให้ชัดเจนว่าเป็นวันที่คอมมิตของแท็กที่คุณตามหลัง เนื่องจากแท็กไม่มีวันที่
jobwat


2

คำตอบ:


70

ใช้--formatอาร์กิวเมนต์เพื่อgit log:

git log -1 --format=%ai MY_TAG_NAME

3
เคล็ดลับ - แทนที่ "TAG" ด้วยชื่อแท็ก ตัวอย่างเช่นgit log -1 --format=%ai v0.2.3.
Tobias

5
ถ้าคุณต้องการ ISO8601 ให้ทำ--format=%aI(ตัวพิมพ์ใหญ่ "I")
Chaim Eliyah

git log -1 --format=%ai MY_TAG_NAME | catปิดการใช้งานการดูหน้าเว็บ
elinx

"-1" กำลังทำอะไรอยู่
Blademaster

@Blademaster มันบอกgit logให้แสดงการคอมมิตเดียวอันที่เกี่ยวข้องกับแท็ก พฤติกรรมดีฟอลต์คือการแสดงคอมมิตทั้งหมดจากที่ระบุกลับไปที่คอมมิตแรกในที่เก็บข้อมูล
user4815162342

85

สิ่งนี้ใช้ได้ผลสำหรับฉันเสมอ:

git log --tags --simplify-by-decoration --pretty="format:%ci %d"

ดูส่วน "รูปแบบที่สวยงาม" ของ manpage git-log สำหรับรายละเอียดของสตริงรูปแบบหากคุณต้องการจัดรูปแบบวันที่อื่น


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

5
เพียงแค่ใส่taglog = log --tags --simplify-by-decoration --pretty='format:%ci %d'(สังเกต single-, not double-quotes) ในส่วน [alias] ของไฟล์. gitconfig ของคุณและตอนนี้คุณมีคำสั่ง git taglog :)
Lambart

45

อีกหนึ่งทางเลือก:

git for-each-ref --format="%(refname:short) | %(creatordate)" "refs/tags/*"

ดูhttps://git-scm.com/docs/git-for-each-ref#_field_namesสำหรับตัวเลือกรูปแบบ

%(creatordate) ให้วันที่ของการกระทำที่ชี้ไปที่เพื่อดูวันที่สร้างแท็กเมื่อใช้งาน %(taggerdate)

คุณสามารถรวมเชลล์ได้โดยตรง:

$> git for-each-ref --shell --format="ref=%(refname:short) dt=%(taggerdate:format:%s)" "refs/tags/*"

ref='v1.10' dt='1483807817'
ref='v1.11' dt='1483905854'
ref='v1.12.0' dt='1483974797'
ref='v1.12.1' dt='1484015966'
ref='v1.13' dt='1484766542'
ref='v1.2' dt='1483414377'
ref='v1.3' dt='1483415058'
ref='v1.3-release' dt='' <-- not an annotated tag, just a pointer to a commit so no 'taggerdate', it would have a 'creator date'.
ref='v1.3.1' dt='1483487085'
ref='v1.4' dt='1483730146'
ref='v1.9' dt='1483802985'

3
นี่คือคำตอบที่ดีที่สุดสำหรับการหาวันที่แท็ก
Joseph K. Strauss

หรือคุณสามารถรับการประทับเวลายูนิกซ์ที่มีgit for-each-ref --format="%(taggerdate:unix)" refs/tagsหรือเป็นสตริงย่อยได้ในgit for-each-ref --format="%(taggerdate:raw)" refs/tags
RD

1
ขอขอบคุณ! คำตอบอื่น ๆ ทั้งหมดเพียงแค่ระบุวันที่กระทำไม่ใช่วันที่แท็ก
แซม

ใช่คำตอบที่ดีที่สุดสำหรับ defo เนื่องจากแสดงเฉพาะแท็กจริงเท่านั้นไม่ใช่การกระทำทั้งหมดความเส็งเคร็ง SO มีคำตอบอื่นที่ได้รับการจัดอันดับสูง
samthebest

2
ผลลัพธ์เดียวกันกับการพิมพ์น้อยลง:git tag --format "%(refname:short) %(creatordate:short)"
Andrew Spencer

27

โปรดทราบว่าทั้งสองวิธีข้างต้นทำให้คุณได้รับวันที่คอมมิตซึ่งอาจแตกต่างกันอย่างมากกับเวลาที่คอมมิตนั้นถูกแท็กสำหรับรีลีส หากต้องการทราบวันที่ของแท็กคุณจะต้องค้นหาแท็กด้วยตัวเองrev-parseอ่านด้วยcat-fileแล้วจึงแยกวิเคราะห์ ไปป์ไลน์เล็กน้อย:

git rev-parse v1.0.0 | xargs git cat-file -p | egrep '^tagger' | cut -f2 -d '>'


ดีปัญหาเดียวคือผลลัพธ์ไม่มีรูปแบบ (1419372909 -0300)
Jose_GD

เมื่อคุณมีรหัสคอมมิตจาก rev-parse ฉันเชื่อว่าคุณสามารถทำได้: git rev-parse v1.0.0 | xargs git show -s --pretty =% aI
Keith

@Keith ตอนนี้คุณกลับมาแสดงวัน
เบ็น

3

ไม่มีตัวเลือกง่ายๆในคำสั่ง git tag เพื่อทำสิ่งนี้ ฉันพบว่าสะดวกที่สุดในการเรียกใช้

git log --decorate=full

เพื่อแสดงรายการคอมมิตทั้งหมดรวมถึงแท็กหากมี สำหรับรายการคอมมิตที่แท็กใช้เท่านั้น

git log --decorate=full --simplify-by-decoration

สำหรับรายละเอียดให้ใช้

git help log

2

สามารถใช้gawk(not awk) เพื่อแปลงวันที่ในบรรทัด "tagger" เป็นสิ่งที่มนุษย์อ่านได้:

git rev-parse v4.4-rc1 | xargs git cat-file -p | gawk '/^tagger/ { print strftime(PROCINFO["strftime"], $(NF-1)) }'

หากไม่ชอบgawkก็dateสามารถใช้เพื่อแปลงเวลายูนิกซ์:

git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print "@" $(NF-1) }' | xargs date -d

และตัวอย่าง ( dnsmasqgit repo):

$ git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print "@" $(NF-1) }' | xargs date -d
Wed May 18 16:52:12 CEST 2016

คุณลองจากข้างคุณหรือไม่ ??
Vishal Patel

แน่นอน มันใช้งานได้dnsmasqgit repo เช่น $ git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print strftime(PROCINFO["strftime"], $(NF-1)) }' Wed May 18 16:52:12 CEST 2016
vladis

0

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

for ver in `git tag | tail -10`; do
    DATE=`git log -1 --format=%ai $ver | awk '{print $1}'`
    MESSAGE=`git tag -n $ver | cat | awk '{a=match($0, $2); print substr($0,a)}'`
    echo "$ver \t| $DATE | $MESSAGE"
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.