2012-11-03 27 views
50

Tôi có một dự án đang sử dụng git và đã gắn thẻ tất cả các bản phát hành có thẻ.Lấy ngày giờ của thẻ git

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

Mục tiêu của tôi là để liệt kê các phiên bản và phát hành ngày trong một giao diện web (thẻ/cam date = ngày phát hành). Hiện tại, chúng tôi liệt kê tất cả các bản phát hành bằng cách sử dụng git tag.

Làm cách nào để có được thời gian và ngày cho khi thẻ được tạo (hoặc cam kết nó trỏ đến)?

+1

Đó là tốt để chính xác ở đây rằng đó là ngày cam kết của thẻ mà bạn đang theo đuổi. Vì thẻ không có ngày. – jobwat

+0

Có thể trùng lặp [Làm cách nào để có thể liệt kê tất cả các thẻ trong kho lưu trữ Git của tôi trước ngày chúng được tạo?] (Https://stackoverflow.com/questions/6269927/how-can-i-list-all-tags-in- my-git-repository-by-the-date-chúng-đã-được tạo ra) –

Trả lời

35

Sử dụng đối số --format-git log:

git log -1 --format=%ai MY_TAG_NAME 
+2

M TO - Thay thế "TAG" bằng tên thẻ. Ví dụ: 'git log -1 --format =% ai v0.2.3'. – Tobias

+2

Nếu bạn muốn ISO8601, hãy làm '--format =% aI' (vốn" I ") –

56

này luôn luôn làm việc cho tôi:

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

Tham khảo "CÁC DẠNG PRETTY" của manpage git-log để biết chi tiết của chuỗi định dạng nếu bạn muốn có một định dạng ngày khác.

+6

Để được cảnh báo, điều này sẽ liệt kê ngày/giờ cho cam kết, nhưng không phải ngày/giờ cho thẻ được chú thích. – WiSaGaN

+2

... mà tôi thích –

+0

Chỉ cần đặt 'taglog = log --tags --simplify-by-decoration --pretty = 'format:% ci% d'' (lưu ý đơn, KHÔNG dấu ngoặc kép) trong [bí danh] phần của tệp .gitconfig của bạn và bây giờ bạn đã có lệnh git taglog :) – Lambart

20

Lưu ý rằng cả hai giải pháp trên giúp bạn có ngày, có thể là một cách hoang dại khác so với khi điều đó cam kết đã được gắn thẻ cho phát hành cam kết. Để có được ngày của thẻ, bạn phải tìm chính thẻ đó bằng rev-parse, đọc nó với cat-file và sau đó phân tích cú pháp thẻ. Một đường ống nhỏ:

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

+0

Tốt, chỉ có vấn đề là kết quả không được định dạng (1419372909 -0300) –

1

người ta có thể sử dụng gawk (không awk) để chuyển đổi ngày trong "tagger" dòng để một cái gì đó con người có thể đọc được:

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

nếu ta không thích gawk sau đó date có thể được sử dụng để chuyển đổi thời gian unix:

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

và kiểm tra ple (dnsmasq git 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 
+0

bạn có thử điều này từ bên mình không ?? –

+0

chắc chắn. nó hoạt động, 'dnsmasq' git repo, ví dụ: ' $ 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

1

Không có tùy chọn đơn giản trong lệnh tag git để làm điều này. Tôi thấy thuận tiện nhất để chạy

git log --decorate=full 

để liệt kê tất cả các cam kết bao gồm thẻ nếu có.Niêm yết chỉ cam kết được gắn thẻ sử dụng

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

Để biết chi tiết sử dụng

git help log 
7

Thêm một lựa chọn:

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

Xem https://git-scm.com/docs/git-for-each-ref#_field_names cho các tùy chọn định dạng

%(creatordate) cho ngày cam kết chỉ ra, để xem ngày thẻ được tạo trên sử dụng %(taggerdate)

Bạn có thể kết hợp vỏ trực tiếp:

$> 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' 
+2

Đây là câu trả lời hay nhất để nhận thẻ ngày. –

+0

Hoặc, bạn có thể lấy dấu thời gian unix với 'git cho-each-ref - format ="% (taggerdate: unix) "refs/tags' hoặc dưới dạng chuỗi con trong' git for-each-ref --format = "% (taggerdate: raw) "refs/tags' –

+0

Cảm ơn bạn! Tất cả các câu trả lời khác chỉ cung cấp ngày cam kết chứ không phải ngày gắn thẻ. – Sam

Các vấn đề liên quan