Làm cách nào để tìm thẻ được liên kết với một cam kết git nhất định?


90

Đối với các bản phát hành, tôi thường gắn thẻ với một cái gì đó như v1.1.0. Trong quá trình xây dựng tập lệnh, tôi đang tạo tệp fwVersion.c có chứa thông tin git hiện tại. Hiện tại, tôi có cam kết và thông tin chi nhánh trong tệp, nhưng tôi muốn thêm thẻ.

Điều này có khả thi không?

Câu trả lời:


114

Kiểm tra tài liệu cho git describe. Nó tìm thẻ gần nhất với một cam kết nhất định (đó là một thẻ trỏ đến tổ tiên của cam kết) và mô tả cam kết đó về mặt thẻ.

Nếu bạn chỉ muốn biết liệu cam kết có được trỏ đến bởi một thẻ hay không thì bạn có thể kiểm tra kết quả đầu ra của:

git describe --exact-match <commit-id>

32
git describe --tags <commit-id>cho thẻ unannotated
Aleksandr Levchuk

1
Tôi thích điều này. Spefically, tôi yêu mà tôi có thể có được một người đọc được từ các phiên bản hiện tại:git describe --all --exact-match `git rev-parse HEAD`
dsummersl

5
Trong các phiên bản mới hơn, git describe --tags --abbrev=0 REVsẽ hữu ích khi bạn không muốn có rác trên thẻ.
Craig Ringer

1
git describe --all(đối với cam kết đã thanh toán hiện tại) hoặc git describe --all <commit>luôn làm mọi thứ tôi muốn.
rfay

Phần tốt nhất của việc sử dụng các phiên bản từ git là không cần mã hóa phiên bản trong nguồn khi một phần mềm được triển khai. Cách tìm thẻ gần nhất của git description có thể được sử dụng để tính số phiên bản tiếp theo và chỉ cần thêm ref của thẻ vào repo và tên gói.
Sid

62

Nếu những gì bạn muốn là thẻ đầu tiên chứa cam kết thì:

git describe --contains <commit>

đưa ra câu trả lời tốt nhất IMO. Nếu bạn có các thẻ thường xuyên hơn việc sử dụng "git tag --contains" trên một cam kết cũ trong một kho lưu trữ lớn thì có thể mất một lúc để chạy và cung cấp cho bạn tất cả các thẻ chứa cam kết đó.

Dạng git description này chạy rất nhanh và cung cấp cho bạn một giá trị đầu ra duy nhất là thẻ đầu tiên chứa cam kết và mức độ lùi lại của cam kết của bạn.


27

Còn cái này thì sao?

git tag --points-at <commit-id>

Nó cung cấp cho bạn tất cả các thẻ mà cam kết đã cho có (trong khi git describechỉ cung cấp cho bạn một thẻ), và không bao gồm các thẻ trên các cam kết con (giống như git tag --containsvậy).


Tôi thích điều này vì không có thông báo lỗi nào được ghi vào stderr. Cảm ơn.
Basuke

23

Bạn có thể tìm thấy thông tin này trong sách hướng dẫn

git tag --contains <commit>

3
Điều này sẽ liệt kê tất cả các thẻ có chứa cam kết đã cho (tức là các thẻ trỏ đến con của cam kết đã cho), vì vậy nó không nhất thiết phải cung cấp một thẻ duy nhất cho một cam kết nhất định hoặc bất kỳ thông tin nào về thẻ nào gần nhất, trừ khi danh sách chỉ chứa một cam kết duy nhất.
CB Bailey

4
Như Charles Bailey đã nói ở trên, đó không chính xác là những gì tôi đang tìm kiếm. Có lẽ bạn nên RTFM :)
wes 24/09/09

1
Vâng, xin lỗi vì câu trả lời sai. Khi tôi kiểm tra, nó dường như làm những gì bạn đang yêu cầu. Tôi đã làm RTFM, tôi chỉ đang giải quyết vấn đề sai. Hy vọng Bailey đưa ra một giải pháp giúp bạn.
dharga 25/09/09

6
bạn không cần phải đọc toàn bộ hướng dẫn sử dụng git trước khi đặt câu hỏi git trên SO, phải không? chỉ số google SO tốt hơn so với bất kỳ người đàn ông trang git ... nhiều
aaronstacy

13

Tôi tìm thấy kết hợp của cả hai câu trả lời hàng đầu để cung cấp cho tôi những gì tôi muốn như vậy:

git describe --tags --exact-match <commit-id>

Điều này cung cấp cho bạn thẻ CHỈ dành cho cam kết đó và cho những thẻ không có chú thích. Hữu ích khi bạn muốn tìm các thẻ và không phải lo lắng về việc loại bỏ định dạng khi đó (ví dụ: đối với Jenkins).

ví dụ. $ git describe --tags --exact-match head~2

Mang đến cho bạn:

$ ReleaseBeta

0

Củng cố một số câu trả lời:

git tag --contains [<ref>]

git tag --points-at [<ref>]

hay chỉ

git tag

hoạt động giống nhau, in bất kỳ (và tất cả) thẻ cho ref được chỉ định hoặc cam kết hiện tại nếu không được chỉ định.

git describe --tags [<ref>]

trong đó <ref>mặc định cho cam kết hiện tại, thoát với 128 nếu không có thẻ nào được liên kết với cam kết và in một thẻ được liên kết với cam kết (dường như không có một mẫu).

git describe [<ref>] hoạt động giống như với --tagsngoại trừ việc nó chỉ in các thẻ được chú thích.

Chuyên cung cấp các tùy chọn --containsđể describesẽ in các thẻ đó là liên kết với tổ tiên của các quy định cam kết. Ví dụ

$ git init
Initialized empty Git repository in /tmp/test
$ git commit -m one --allow-empty
[master (root-commit) 7fdfff2] one
$ git commit -m two --allow-empty
[master cd5f8f1] two
$ git tag -am foo foo
$ git tag bar
$ git log --format=oneline
cd5f8f1f4f29eb164f83e224768ccaf37fe170ed (HEAD -> master, tag: foo, tag: bar) two
7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1 one
$ git describe 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
fatal: No tags can describe '7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1'.
Try --always, or create some tags.
$ git describe --contains 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
bar~1

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.