Làm cách nào tôi có thể liệt kê tất cả các thẻ trong kho Git của mình trước ngày chúng được tạo?


128

Tôi cần một số cách để liệt kê tất cả các thẻ trong hệ thống của mình trước ngày chúng được tạo nhưng tôi không chắc liệu tôi có thể lấy dữ liệu đó qua git-log hay không. Ý tưởng?


2
Bạn có nghĩa là bạn muốn có được danh sách tất cả các thẻ theo thứ tự ngày tạo?
lithuak

3
FYI (1.) Câu hỏi này là để liệt kê các thẻ ANNOTATED theo ngày. (2.) Để liệt kê các thẻ LIGHTCHIGHT theo ngày, hãy truy cập vào đây . (3.) Để được nhắc nhở hữu ích về sự khác biệt giữa các thẻ nhẹ so với chú thích của Git, hãy truy cập vào đây .
Trevor Boyd Smith

@TrevorBoydSmith: Điều đó không hoàn toàn chính xác. Sự khác biệt là (2) liệt kê tất cả các thẻ theo ngày cam kết của cam kết được gắn thẻ , trong khi trang này đưa ra các giải pháp sắp xếp theo ngày được gắn thẻ (mặc dù chỉ dành cho các thẻ có chú thích, vì git không lưu trữ ngày được gắn thẻ cho các thẻ nhẹ).
David P

Câu trả lời:


174

Sắp xếp theo ngày tạo thẻ hoạt động với các thẻ chú thích và nhẹ:

git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags

12
Tuyệt vời. git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagsđã làm chính xác những gì tôi cần. Cảm ơn!
Jon Ursenbach

21
Một giải pháp của @DrorCohen hoạt động cho các thẻ nhẹ: stackoverflow.com/questions/6900328/ mẹo . Dán ở đây để tham khảo dễ dàng: git log --tags --simplify-by-trang trí --pretty = "định dạng:% ai% d"
Gilead

5
Có thể sử dụng %(contents)để thêm vào chú thích nếu cần thiết, ví dụ nhưgit for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Tim Diggins

7
Hoặc thậm chí sạch hơn một chút:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers

4
--sort=creatordatehoạt động cho cả thẻ chú thích và không được chú thích, nhưng --sort=taggerdatedường như chỉ hoạt động với các thẻ chú thích. đã thử nghiệm bằng cách sử dụnggit version 2.16.3
austinheiman

56

Git 2.8 (Tháng 3 năm 2016) ghi lại một tùy chọn khác có niên đại từ git 1.4.4 (tháng 10 năm2006) .
Xem cam kết e914ef0 (ngày 5 tháng 1 năm 2016) của Eric Wong ( ele828) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 108cb77 , ngày 20 tháng 1 năm 2016)

Xem mới Documentation/git-for-each-ref.txt

Đối với các đối tượng cam kết và thẻ, đặc biệt creatordatecreator các trường sẽ tương ứng với bộ dữ liệu ngày hoặc tên email-email thích hợp từ committerhoặc taggercác trường tùy thuộc vào loại đối tượng.
Chúng được dùng để làm việc trên một hỗn hợp các thẻ chú thích và nhẹ .

Vì vậy, sử dụng creatordatehoạt động với các thẻ:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }' 

Hoặc là:

git tag --sort=-creatordate 

Như tôi nêu chi tiết trong " Cách sắp xếp thẻ git theo thứ tự chuỗi phiên bản của mẫu RC-XYZW? ", Bạn có thể thêm thứ tự sắp xếp vào git tag(kể từ Git 2.0 tháng 6 năm 2014).

Thứ tự sắp xếp đó bao gồm tên trường (được liệt kê trong git for-each-ref) taggerdate . Điều đó cho phép git tag --sort=taggerdate(được đề cập bởi DarVar bên dưới )
Ví dụ, trong git/gitrepo, nó sẽ liệt kê v2.10.0thẻ cuối cùng:

v2.9.1
v2.9.2
v2.9.3
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.10.0

Thứ tự mặc định sẽ không ( git tag):

v2.1.2
v2.1.3
v2.1.4
v2.10.0
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.2.0

Cảm ơn rất nhiều. Tôi đã tự hỏi tại sao một số ngày trống rỗng. Tôi đã nghi ngờ các thẻ nhẹ. Tôi rất vui vì tôi không cần phải tạo lại các thẻ nhờ creatordate!
shoutuma

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

Ngoài ra đầu ra đẹp từ (không có trường ngày):

git log --tags --decorate --simplify-by-decoration --oneline

Để xem toàn bộ lịch sử với các phụ thuộc và các cam kết tuyến tính sọc (chỉ các sự kiện thiết yếu, như gắn thẻ và phân nhánh / hợp nhất):

git log --graph --decorate --simplify-by-decoration --oneline --all

Đối với những người lười biếng: git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"và nó hoạt động tốt nhất cho tôi.
Mateusz

1
Lưu ý rằng điều này được sắp xếp theo ngày cam kết, không phải ngày thẻ được tạo. Câu trả lời được xếp hạng hàng đầu (hiện tại) từ Josh Lee thực hiện theo thứ tự vào ngày thẻ được tạo.
Nathanial Woolls

13
git tag --sort=-taggerdate

Theo trang man, "Tiền tố - để sắp xếp theo thứ tự giảm dần của giá trị."

git tagsử dụng các khóa sắp xếp tương tự như git-for-each-ref, đó là nơi các khóa được ghi lại.


1
Đây có lẽ là chính xác nhất dựa trên câu hỏi. Dưới đây là các liên kết đến các tài liệu nêu rõ các lĩnh vực loại tốt: git-scm.com/docs/git-for-each-ref
prasanthv

Phản hồi này không tính đến các thẻ nhẹ vì chúng có "taggerdate" trống. Các phản hồi khác với "creatordate" thì chính xác hơn.
morhook

13

Điều này một lớp hiển thị ngày & thẻ mà không có bất kỳ phiền phức.

git tag --format='%(creatordate:short)%09%(refname:strip=2)'

Đầu ra:

2015-04-01  storaged-2.0.0
2015-06-11  storaged-2.1.0
2015-08-06  storaged-2.1.1
...

Nếu bạn không thích cách các thẻ được sắp xếp theo mặc định, chẳng hạn, bạn có thể sắp xếp theo ngày với tùy chọn --sort=creatordate. Xem câu trả lời của VonC để biết thêm chi tiết.


Là phương pháp tốt đẹp này bị ràng buộc để sắp xếp chúng theo ngày? tăng dần? giảm dần?
Motti Shneor

11

Để có các thẻ chú thích và các thẻ nhẹ được sắp xếp hoàn toàn, dựa trên ngày cam kết, tôi đang sử dụng:

git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
  sort -n | awk '{ print $4, $3; }' 

Lệnh này sẽ liệt kê mọi thẻ và id đối tượng cam kết liên quan, theo thứ tự thời gian.


Bối rối một chút. ... Trong các thẻ được chú thích, 'committerdate' trống trong khi trong các thẻ nhẹ 'taggerdate' trống. Vì vậy, như một cách giải quyết '* committerdate' đang nói với Git về ngày phản hồi từ đối tượng cam kết ban đầu khi nó nhẹ. ...
ingyhere

Thay vào đó, sử dụng 'creatordate' sẽ thực hiện điều tương tự.
ingyhere

7

Với Git version 2.10.0.windows.1

git tag --sort=taggerdate


5

Những điều sau đây phụ thuộc vào cam kết, vì vậy không có vấn đề gì nếu nó có thông tin ngày với cam kết:

git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac

Câu trả lời ở trên của Josh Lee, dựa vào ngày gắn thẻ để đặt hàng đúng.


Không chắc lệnh trailing taclà gì - có thể thay đổi nó thành more. Dù sao lệnh của bạn đã làm việc tuyệt vời - cảm ơn!
David H


3

Dựa trên các phương pháp được đề cập trước đó, tôi cũng muốn xem ngày thẻ thực tế trong danh sách, và vì vậy phiên bản sử dụng của tôi là:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
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.