Đây là tập lệnh trình bao ngắn gọn (được kiểm tra trong Bash, không được xác nhận nếu nó hoạt động trên tro, v.v.). Nó sẽ đặt biến số git_tag
thành tên của thẻ hiện được kiểm tra hoặc để trống nếu thanh toán không được gắn thẻ.
git_tag=''
this_commit=`git log --pretty=format:%H%n HEAD^..`
for tag in `git tag -l`; do
tag_commit=`git log --pretty=format:%H%n tags/$tag^..tags/$tag`
if [ "$this_commit" = "$tag_commit" ]; then
# This is a tagged commit, so use the tag.
git_tag="$tag"
fi
done
Comment by Jakub Narębski:
Giải pháp này giảm để lặp qua tất cả các thẻ, và kiểm tra nếu chúng trỏ tới corrent cam kết, ví dụ: đối tượng được trỏ bởi HEAD. Sử dụng các lệnh hệ thống ống nước, tức là các lệnh dành cho tập lệnh, điều này có thể được viết là:
this_commit=$(git rev-parse --verify HEAD)
git for-each-ref --format="%(*objectname) %(refname:short)" refs/tags/ |
while read tagged_object tagname
do
if test "$this_commit" = "$tagged_object"
then
echo $tagname
fi
done
Điều này sẽ in tất cả các thẻ trỏ đến cam kết hiện tại.
Hãy xem GIT-VERSION-GEN kịch bản (và việc sử dụng nó trong Makefile) trong kho git: http://git.kernel.org/?p=git/git.git;a=blob;f=GIT-VERSION-GEN;hb=HEAD –
@jhs: Tôi đã upvoted Greg Hewgill trả lời . Tôi đã downvoted câu trả lời dựa trên 'git name-rev' bởi vì nó có thể trở lại ví dụ: 'some-tag ~ 5' và câu trả lời dựa trên sự kết hợp của 'git log' và' git tag -l' vì nó là xấu và không hiệu quả. –