Làm cách nào để biết một thẻ git đã cho là có chú thích hay nhẹ?


79

Tôi nhập git tagvà nó liệt kê các thẻ hiện tại của tôi:

1.2.3
1.2.4

Làm cách nào để xác định cái nào trong số này được chú thích và cái nào nhẹ?


3
git tag -nlàm gì cho bạn không
Oxymoron

Chú thích thẻ không phải là một thông báo cam kết. Bạn không thể nhìn thấy nó với git-log (1); bạn cần phải sử dụng git-show (1)
oxymoron

thẻ git -n thật thú vị! Nhưng nó không chống đạn cho vấn đề cụ thể của tôi.
G. Sylvie Davies

1
Tôi thích "git show-ref -d --tags".
G. Sylvie Davies

Câu trả lời:


55

git for-each-refcho bạn biết theo mặc định mỗi ref là gì, id của nó và kiểu của nó. Để giới hạn nó chỉ với các thẻ, hãy làm git for-each-ref refs/tags.

[T] he xuất ra có ba trường: Hàm băm của một đối tượng, loại đối tượng và tên trong refs / thẻ đề cập đến đối tượng. Cái gọi là thẻ "nhẹ" là một tên trong các thẻ refs / đề cập đến mộtcommit đối tượng. Thẻ "annotated" là một tên trong refs / thẻ đề cập đến một tagđối tượng.

- Solomon Slow (trong phần bình luận)

Đây là một ví dụ:

git for-each-ref refs/tags                                           
902fa933e4a9d018574cbb7b5783a130338b47b8 commit refs/tags/v1.0-light
1f486472ccac3250c19235d843d196a3a7fbd78b tag    refs/tags/v1.1-annot
fd3cf147ac6b0bb9da13ae2fb2b73122b919a036 commit refs/tags/v1.2-light

7
Khi tôi thử điều này, kết quả đầu ra được liệt kê mỗi thẻ là a commithoặc a tag. Tôi cho rằng đó là các thẻ nhẹ và có chú thích tương ứng?
Stevoisiak

4
@StevenVascellaro Đúng vậy, một thẻ nhẹ chỉ là tham chiếu cục bộ bắt đầu từ "refs / tags", nó có thể là bất cứ thứ gì. Một thẻ trong đối tượng db không chỉ có một cái tên và có thể được chuyển đi xung quanh như bất kỳ đối tượng nào khác. Git tạo tham chiếu cục bộ cho mọi thẻ trong đối tượng db nên sự phân biệt có phần mờ nhạt, nói chung không ai phải quan tâm nhiều khi quy trình công việc được thiết lập cho dự án của họ.
jthill

3
Vậy commitcó nhẹ và tagđược chú thích không?
Pontiacks

6
@Pontiacks, đầu ra có ba trường: Hàm băm của đối tượng, loại đối tượng và tên trong refs / thẻ tham chiếu đến đối tượng. Cái gọi là thẻ "nhẹ" là một tên trong các thẻ refs / đề cập đến một commitđối tượng. Thẻ "annotated" là một tên trong refs / thẻ đề cập đến một tagđối tượng.
Solomon Slow vào

44

Loại git show-ref -d --tagslệnh thực hiện điều đó, vì các thẻ nhẹ xuất hiện một lần trong đầu ra và các thẻ chú thích xảy ra hai lần. Ngoài ra, chỉ các thẻ được chú thích mới bao gồm toán tử tham chiếu "^ {}" trong đầu ra.

588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.3
7fe2caaed1b02bb6dae0305c5c0f2592e7080a7a refs/tags/1.2.4
588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.4^{}

Và đầu ra đó không thể được xoa bóp bằng các lệnh unix sort, sed, cut, và uniq để làm cho đầu ra dễ đọc hơn:

git show-ref -d --tags       | 
cut -b 42-                   | # to remove the commit-id
sort                         |
sed 's/\^{}//'               | # remove ^{} markings
uniq -c                      | # count identical lines
sed 's/2\ refs\/tags\// a /' | # 2 identicals = annotated
sed 's/1\ refs\/tags\//lw /'   

Đối với repo gốc của tôi (từ câu hỏi của tôi), nó xuất ra như sau:

  lw 1.2.3
   a 1.2.4

(ví dụ: 1.2.3 là "nhẹ" và "1.2.4" được chú thích).


26

Lấy tên thẻ (nói foo) và sau đó thực hiện a git cat-file -t foo. Nếu đó là một thẻ được chú thích, cat-filesẽ cho bạn biết rằng đó là một "thẻ". Nếu đó là một thẻ đơn giản, cat-filesẽ cho bạn biết rằng đó là "cam kết".

Cập nhật: Như oxymoron đã nói trong bình luận của mình, git shownó cũng hoạt động nhưng nó cung cấp cho bạn nhiều thông tin hơn là chỉ loại thẻ đó là gì.


2
Đối với "một thẻ nhất định" (như đã nêu trong câu hỏi), điều này dường như cho đến nay câu trả lời tốt nhất.
phils

1
Câu trả lời tuyệt vời - chìa khóa cho cách hoạt động của điều này là tùy chọn "-t" trên "git cat-file." Như trang người giải thích: "-t Thay vì nội dung, hãy hiển thị loại đối tượng được xác định bởi <đối tượng>."
G. Sylvie Davies

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.