Nhận ngày và giờ của thẻ git


88

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 bằng một thẻ.

$ 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 bản phát hành và ngày phát hành trong giao diện web (tag / ngày cam kết = 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 để lấy ngày giờ mà thẻ được tạo (hoặc cam kết mà nó trỏ đến)?


2
Thật tốt khi nói chính xác ở đây là ngày cam kết của thẻ mà bạn đang theo dõi. Như một thẻ không có ngày.
jobwat


Câu trả lời:


71

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

git log -1 --format=%ai MY_TAG_NAME

3
MẸO - Thay "TAG" bằng tên thẻ. Ví dụ git log -1 --format=%ai v0.2.3,.
Tobias

5
Nếu bạn muốn ISO8601, làm --format=%aI(vốn "I")
Chaim Eliyah

git log -1 --format=%ai MY_TAG_NAME | catvô hiệu hóa chế độ xem trang
elinx 19/12/18

"-1" đang làm gì?
Blademaster

@Blademaster Nó yêu git logcầu chỉ hiển thị một cam kết, một cam kết liên quan đến thẻ. Hành vi mặc định là hiển thị tất cả các cam kết từ một được chỉ định trở lại cam kết đầu tiên trong kho lưu trữ.
dùng4815162342

83

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

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

Tham khảo phần "ĐỊNH DẠNG THUỘC TÍNH" của trang git-log để biết chi tiết về chuỗi định dạng nếu bạn muốn định dạng ngày khác.


13
Tuy nhiên, đượ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ẻ chú thích.
WiSaGaN

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

39

Thêm một tùy chọn:

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

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

%(creatordate) cung cấp ngày cam kết được trỏ đến, để xem ngày thẻ được tạo để sử dụng %(taggerdate)

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

$> 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
Đây là câu trả lời tốt nhất để biết ngày gắn thẻ.
Joseph K. Strauss

Ngoài ra, bạn có thể lấy dấu thời gian unix có git for-each-ref --format="%(taggerdate:unix)" refs/tagshoặc dưới dạng chuỗi con tronggit for-each-ref --format="%(taggerdate:raw)" refs/tags
RD

1
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âu trả lời tốt nhất defo vì nó chỉ hiển thị các thẻ thực tế, không phải tất cả các cam kết, xấu hổ crappy SO có các câu trả lời khác được đánh giá cao hơn.
samthebest

2
cùng kết quả với ít gõ:git tag --format "%(refname:short) %(creatordate:short)"
Andrew Spencer

27

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

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


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

Khi bạn có id cam kết từ phân tích cú pháp rev, tôi tin rằng bạn có thể làm được: git rev-parse v1.0.0 | xargs git show -s --pretty =% aI
Keith

@Keith Bây giờ bạn quay lại hiển thị ngày tác giả của cam kết thay vì ngày được gắn thẻ, ít nhất là đối với các thẻ có chú thích
Ben

3

Không có tùy chọn đơn giản nào trong lệnh thẻ git để thực hiện việc 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 các thẻ nếu có một số. Đối với danh sách 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

2

một người có thể sử dụng gawk (not awk) để chuyển đổi ngày tháng trong dòng "trình gắn thẻ" thành thứ mà 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 ai đó không thích gawk thì datecó 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à ví 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

bạn có thử cái này từ bên mình không ??
Vishal Patel

chắc chắn. nó hoạt động, dnsmasqgit 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.