Cách liệt kê tất cả các thẻ trỏ đến một cam kết cụ thể trong git


81

Tôi đã xem các lệnh git describegit-name-revnhưng tôi đã không quản lý để đưa chúng vào danh sách nhiều hơn một thẻ.

Ví dụ: Tôi có sha1 48eb354 và tôi biết các thẻ A và B trỏ đến nó. Vì vậy, tôi muốn một lệnh git git {something} 48eb354tạo ra đầu ra tương tự như "A, B". Tôi không quan tâm đến việc biết các tham chiếu liên quan đến các thẻ hoặc chi nhánh khác chỉ đối sánh chính xác cho các thẻ.

Câu trả lời:


45

git show-ref --tags -d | grep ^48eb354 | sed -e 's,.* refs/tags/,,' -e 's/\^{}//'

sẽ hoạt động cho cả thẻ nhẹ và thẻ chú thích.


Cảm ơn. Chính xác những gì tôi muốn.
mrutyunjay 27/12/13

Điều này hoạt động tốt cho git <1,7.10. Bạn có thể giải thích phần thứ hai của biểu thức sed làm gì không? -e 's/\^{}//'
Dave

À, đừng bận tâm, đã tìm ra. Nó cho -dtùy chọn bật git show-ref. Từ tài liệu, các thẻ "-d, --dereference Dereference" cũng được chuyển thành ID đối tượng. Chúng sẽ được hiển thị với "^ {}" được thêm vào. "
Dave

1
Nhẹ nâng cao / tổng quát cho việc sử dụng tùy tiện ${ref}, bao gồm các thẻ chú thích:hash=$(git rev-parse "${ref}^0"); git show-ref --tags -d | sed -n -e 's,^'"${hash}"' refs/tags/\(.*\)^{}$',\1,p'
Christian Goetze


50

Bạn có thể dùng:

git tag --contains <commit>

hiển thị tất cả các thẻ tại một số cam kết nhất định. Nó có thể được sử dụng thay thế cho:

git tag --points-at HEAD

chỉ có sẵn từ 1.7.10.


10
NB: 'git tag --contains' không chỉ hiển thị các thẻ trỏ đến cam kết, mà còn bao gồm bất kỳ thẻ nào sau này mà nó có thể truy cập được.
staafl

Ít nhất trong phiên bản 2.6.4, điều này chỉ trả về một thẻ duy nhất trỏ đến cam kết được chỉ định. Nó không trả lại tất cả. Câu trả lời ở trên của @max dường như hoạt động đúng cho nhiều thẻ.
Dejay Clayton

--containscũng xuất hiện chậm hơn nhiều so với --points-at(thời gian thực hiện 7-8s vs <1s)
SSilk

4
git for-each-ref --format='%(objectname) %(refname:short)' refs/tags/ |
  grep ^$commit_id |
    cut -d' ' -f2

Thật đáng tiếc, nó không thể được thực hiện dễ dàng hơn. Một cờ khác git tagđể bao gồm các ID cam kết có thể thể hiện git for-each-reflời gọi đó một cách tự nhiên.


1
Cảm ơn vì thông tin nhưng tôi dường như cũng không thể nhìn thấy các thẻ bằng cách sử dụng lệnh này. Sử dụng "git for-each-ref | grep 48eb354" đơn giản hơn sẽ cho 0 kết quả phù hợp. Mặt khác, gitk liệt kê 2 thẻ phía trước commit này một cách độc đáo.
Zitrax

1

Lệnh sau thực hiện công việc, nhưng trực tiếp phân tích cú pháp nội dung của thư mục .git và do đó có thể bị hỏng nếu định dạng kho lưu trữ git thay đổi.

grep -l -r -e '^48eb354' .git/refs/tags|sed -e 's,.*/,,'

Cũng không liệt kê chúng, nơi duy nhất tôi thấy sha1 nếu grepping toàn bộ thư mục .git nằm trong gitk.cache và logs / refs / remotes / origin / master. Tại sao gitk có thể liệt kê chúng? Tôi cũng nhận thấy rằng các thẻ tôi đang xem là thẻ được chú thích, đây có thể là lý do tại sao hai câu trả lời hiện tại không hoạt động với tôi.
Zitrax

1

Đối với cam kết hiện tại, bạn có thể sử dụng

git tag --points-at $(git log -n1 --pretty='%H')
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.