Danh sách thẻ Git, hiển thị mã băm commit sha1


101

vì vậy git taglệnh liệt kê các thẻ git hiện tại

tag1
tag2

git tag -n in thông điệp của thẻ

tag1  blah blah
tag2  blah blah

Cách tốt nhất để lấy băm của tag1 & tag2 là gì?


1
Không phải là một câu hỏi tôi xem xét hỏi riêng, nhưng tôi tự hỏi tại sao git tag( -nhoặc một số tùy chọn khác ...) không hiển thị các băm cam kết ngay từ đầu. Thật tuyệt khi thấy mọi người đưa ra giải pháp nào, nhưng tôi coi đây là một lỗ hổng thiết kế trong các tùy chọn có sẵn.
andreee

Câu trả lời:


142

Để nhận thẻ git với hàm băm SHA1 của đối tượng Thẻ, bạn có thể chạy:

git show-ref --tags

Đầu ra sau đó sẽ giống như sau:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

Mỗi dòng là hàm băm SHA1 của thẻ, theo sau là tên thẻ có tiền tố refs/tags/.

Nếu bạn muốn băm SHA1 của cam kết, thay vì đối tượng thẻ, bạn có thể chạy:

git show-ref --tags -d

Điều này sẽ tạo ra đầu ra như:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

Các dòng kết thúc bằng ^{}bắt đầu bằng hàm băm SHA1 của cam kết thực tế mà thẻ trỏ đến.


7
Lưu ý, điều này sẽ không phân biệt giữa thẻ nhẹ và thẻ chú thích. Đối với các thẻ nhẹ, nó sẽ hiển thị cam kết và đối với các thẻ có chú thích, nó sẽ hiển thị hàm băm của chính đối tượng thẻ.
Lily Ballard,

20
Để hiển thị danh sách các thẻ với các tham chiếu được tham chiếu (trong trường hợp thẻ được chú thích), hãy sử dụng git show-ref --tags -d. Các thẻ tham chiếu được gắn hậu tố bằng a ^{}.
S. Christoffer Eliesen

49

Các git taglệnh là kém phát triển. Rất nhiều thứ được mong muốn nhưng lại thiếu trong đó, chẳng hạn như chi tiết thẻ đầy đủ và các thẻ trong thứ tự lịch sử cam kết.

Thay vào đó, tôi thích điều này, nó mang lại chính xác những gì tôi muốn nhưng không thể nhận được từ git tag:

git log --oneline --decorate --tags --no-walk

Điều này cung cấp một chế độ xem được mã hóa màu rất đẹp của các thẻ theo thứ tự thời gian ngược lại (giống như trong nhật ký đầy đủ). Bằng cách đó, bạn không chỉ thấy các thẻ mà còn thấy các hàm băm viết tắt và các thông điệp cam kết của thẻ cam kết.


Tôi đã đặt bí danh cho nó git tgit tagsnhư sau:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

Lưu ý: Tôi đã phải sử dụng chuyển hướng bash git tvì Git không hỗ trợ gọi một bí danh từ một bí danh khác (đó là một kẻ xấu).


Nếu bạn muốn xem ngày và giờ cam kết, hãy thử:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

Bạn có thể sử dụng các định dạng ngày khác trong --datetùy chọn cũng như kiểm soát hoàn toàn đầu ra để phù hợp với sở thích độc đáo của mình trong --prettytùy chọn. Cả hai tùy chọn đều được ghi lại đầy đủ trong Tài liệu git-log .


2
Mặc dù không phải những gì OP yêu cầu (hiển thị các băm sha1 commit ) nhưng nó rất hữu ích vì các thông báo cam kết cũng có thể hữu ích. +1 từ tôi.
Stelios Adamantidis

2
@nealmcb git logthật mạnh mẽ! Bạn có thể làm cho nó hiển thị chính xác những gì bạn muốn. Cố gắng git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. Các định dạng ngày khác cũng có thể. Chỉ cần tra cứu --datetrong trang trợ giúp. Tôi đã cập nhật câu trả lời của mình để bao gồm tùy chọn này.
ADTC

1
@SteliosAdamantidis Thực ra câu trả lời của tôi đưa ra các hàm băm SHA1 viết tắt (7 ký tự đầu tiên) và nếu bạn muốn các hàm băm có độ dài đầy đủ, bạn luôn có thể sửa đổi nó bằng --pretty%H. Cảm ơn bạn đã +1 :)
ADTC

15

Các thẻ được chú thích có SHA-1 của riêng chúng, vì vậy chúng ta cần bỏ qua chúng. Tuy nhiên, các thẻ nhẹ không thể được tham chiếu vì chúng đã trỏ đến một cam kết. Để giải quyết, chúng ta phải liệt kê cả hai và lọc các đối tượng cam kết:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

Kết quả với các thẻ nhẹ:

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

Kết quả với các thẻ được chú thích:

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}

Việc sử dụng git log --tags --oneline --no-walkcũng sẽ tự động xác định các thẻ chú thích. :)
ADTC

11

Để nhận SHA1 được tham chiếu bởi bất kỳ loại ref (nhánh, thẻ ...) nào, hãy sử dụng git rev-parse:

git rev-parse tag1^0 tag2^0

Nó sẽ chỉ in SHA1 đầy đủ, trên các dòng riêng biệt. Các ^0hậu tố là một cú pháp đặc biệt, để đảm bảo rằng điều này sẽ in SHA1 của cam kết trỏ đến bởi thẻ, cho dù đó là chú thích hay không. (Các thẻ được chú thích là các đối tượng theo đúng nghĩa của chúng, chứa một con trỏ đến một cam kết cùng với siêu dữ liệu. Nếu bạn biết một thẻ được chú thích và muốn có SHA1 của thẻ, chỉ cần bỏ đi ^0.)

Tất nhiên, bạn không cần phải thường xuyên làm điều này, vì bất kỳ lệnh Git nào chấp nhận SHA1 cũng sẽ chấp nhận một thẻ!


Câu trả lời hay nhất ở đây, cảm ơn @Jefromi. Lưu ý rằng trong trình bao cmd của Windows, bất kỳ lệnh git nào sử dụng ^ đều cần được trích dẫn: ví dụ: git rev-parse "tag1 ^ 0" "tag2 ^ 0".
yoyo

8

Tôi đã có một câu hỏi tương tự, nhưng muốn băm của (một số) thẻ cụ thể. Tôi nhận thấy rằng "show-ref" sẽ lấy một danh sách các thẻ, vì vậy điều này thực hiện công việc:

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

Tuy nhiên, một số thử nghiệm với "git show" dẫn đến lệnh này:

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

Vì tôi quen thuộc với việc sử dụng "show" hơn "show-ref", tôi thấy cái sau dễ nhớ hơn và cũng hữu ích hơn.

Xem thêm phần tóm tắt thú vị trong Cách biết thẻ cam kết nào trỏ đến trong Git? .


3

Các thẻ phải được ký và / hoặc đánh rối. Các thẻ nhẹ không có đối tượng SHA1 và chỉ là refs. Nếu không, hãy thử git show.


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

Điều này cung cấp một danh sách tất cả các cam kết cho các thẻ. Các thẻ chú thích được bỏ tham chiếu. Gửi lời cảm ơn tại đây .


Giải pháp tuyệt vời. Nếu bạn muốn có Chỉ tagenames thay vì toàn bộ refname, bạn có thể thay đổi sử dụng %(refname:short)thay vì %(refname).
Radon8472

2

Tôi đã lấy lệnh từ bài đăng của anatoly techtonik đã thêm thông điệp tiêu đề của các thẻ / cam kết và định dạng nó thành cols đẹp.

Kết quả là một đầu ra giống hệt git tag -nnhưng với tiền tố cam kết-băm.

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

Nếu bạn muốn có băm dài thay vì băm ngắn, bạn phải thay thế objectname:shortbằng objectname.

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.