Làm thế nào để biết cam kết thẻ nào trỏ đến trong Git?


410

Tôi có một loạt các thẻ không được quản lý trong kho lưu trữ và tôi muốn tìm ra những cam kết mà chúng trỏ đến. Có một lệnh sẽ chỉ liệt kê các thẻ và SHA cam kết của họ không? Kiểm tra thẻ và nhìn vào ĐẦU có vẻ hơi quá sức với tôi.

Cập nhật

Tôi nhận ra sau khi tôi đã trả lời rằng những gì tôi thực sự muốn chỉ đơn giản là nhìn vào lịch sử dẫn đến thẻ, điều đó git log <tagname>là đủ.

Câu trả lời được đánh dấu là câu trả lời rất hữu ích để nhận danh sách các thẻ và cam kết của chúng, đó là những gì tôi đã hỏi. Với một chút hack shell, tôi chắc chắn có thể chuyển đổi chúng thành tin nhắn SHA + Commit.


3
Tôi muốn chỉ ra rằng git show-refsha của thẻ, không phải sha của sửa đổi repo. $ Git show-ref thử nghiệm 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / kiểm tra $ git thử nghiệm kiểm tra ĐẦU hiện tại là c7f8831 ... $ git checkout 08b9c77 ĐẦU hiện tại là c7f8831 ...
Konstantin Pelepelin

nếu các thẻ của bạn được chú thích thì bạn cần--dereference
Trevor Boyd Smith

Câu trả lời:


347

Một cách để làm điều này sẽ là với git rev-list. Sau đây sẽ xuất ra cam kết mà thẻ chỉ ra:

$ git rev-list -n 1 $TAG

Bạn có thể thêm nó dưới dạng bí danh ~/.gitconfignếu bạn sử dụng nó nhiều:

[alias]
  tagcommit = rev-list -n 1

Và sau đó gọi nó với:

$ git tagcommit $TAG

30
Tại sao không sử dụng git rev-parse <tag>? Hay là git rev-list -1 <tag>?
Jakub Narębski

51
@ Jakub: git rev-parse $TAGtrả về SHA1 của đối tượng thẻ, không phải là cam kết mà nó trỏ tới. git rev-list -1công trình, mặc dù.
mipadi

11
@mipadi: Đối với các thẻ không chú thích, điều đó không thành vấn đề; đối với các thẻ có chú thích, bạn có thể sử dụng git rev-parse $TAG^{commit}hoặc git rev-parse $TAG^{}để hủy đăng ký chú thích / thẻ đã ký
Jakub Narębski

5
Bạn có thể sử dụng:git rev-list $TAG --max-count=1
b73

4
@RobinHsu: nếu bạn có các thẻ chú thích , được tạo bằng git tag -ahoặc git tag -s, sau đó git rev-parse <tag>sẽ cung cấp cho bạn SHA-1 của chính đối tượng thẻ , trong khi git rev-list -1 <tag>sẽ cung cấp cho SHA-1 của cam kết (sửa đổi) mà nó trỏ tới, giống như git rev-parse <tag>^{commit}. HTH.
Jakub Narębski

240
git show-ref --tags

Ví dụ, git show-ref --abbrev=7 --tagssẽ cho bạn thấy một cái gì đó như sau:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2

Cảm ơn vì điều đó, điều này thực sự che giấu ngữ nghĩa của việc nhìn vào một trong hai .git/packed-refshoặc.git/refs/tags/*
Igor Zevaka

3
hừm nó có hành vi lạ trong kho lưu trữ của tôi: git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; xem câu trả lời của Jakub Narebski
NickSoft

6
Điều này hoạt động, mặc dù tôi tự hỏi sẽ không có ý nghĩa khi git tag --verbosehiển thị chúng?
phân cực

34
Điều này sẽ hiển thị giới thiệu của chính thẻ, chứ không phải cam kết mà thẻ trỏ tới. Bạn cần thêm -dcờ để nhận được cam kết được tham chiếu (trên dòng thứ hai).
Old Pro

4
@CharlesBailey, đủ công bằng, nhưng câu hỏi và câu trả lời đã biến đổi để bao gồm các thẻ chú thích và thực tế git show-refhành xử khác nhau trên hai loại thẻ khác nhau là không rõ ràng hoặc kiến ​​thức phổ biến.
Old Pro

104

Chỉ dùng git show <tag>

Tuy nhiên, nó cũng bãi bỏ cam kết khác. Để bỏ qua những khác biệt, sử dụng git log -1 <tag>. (Cảm ơn @DolphinDream và @demisx!)


7
Trên SO, khi một câu hỏi có nhiều câu trả lời khác nhau có thể, các câu trả lời được đăng trước tiên sẽ được đưa lên đầu tiên - đặt chúng ở đầu danh sách, và do đó sẽ đưa chúng lên nhiều hơn sau đó. Đây là một vòng phản hồi thiên vị dựa trên tốc độ phản hồi so với chất lượng phản hồi. Với trí tưởng tượng đầy đủ, vấn đề này có thể được khắc phục.
samthebest

6
"Giải pháp tốt nhất" để làm gì? Nếu sở thích là tìm ra SHA của một cam kết, thẻ sẽ trỏ đến "git show <mytag>" KHÔNG phải là giải pháp tốt nhất. Lệnh này sẽ hiển thị toàn bộ diff giới thiệu. Để liệt kê chỉ SHA của cam kết, thẻ chỉ vào "danh sách git rev <mytag> -n 1" là giải pháp chính xác.
Cá heo phát sóng

Đây không phải là câu trả lời cho câu hỏi của OP. git show <tag>hiển thị khác biệt, không phải là cam kết các thẻ trỏ đến.
demisx

@demisx Bạn đang nói về cái gì vậy ?? Nó chắc chắn hiển thị hàm băm cam kết, cùng với thẻ, ngày và các thông tin khác. Thử nó.
Hlung

4
@Hlung Giống như @DolphinDream chỉ ra, git showbỏ rất nhiều thứ khác trên màn hình mà không cần phải ở đó. Nó che khuất cam kết băm thực tế mà một người đang tìm kiếm. Một lệnh tốt hơn là git log -1 [tag-name]hoặc git log -1 --pretty=oneline [tag-name]nếu bạn muốn oneliners.
demisx

40

Trên kho lưu trữ của tôi, git show-ref TAGhiển thị hàm băm của thẻ, không phải hàm băm của cam kết mà nó trỏ tới.

git show-ref --dereference TAG ngoài ra, các cam kết được chỉ vào.


34

Từ Igor Zevaka :

Tóm lược

Vì có khoảng 4 câu trả lời gần như bằng nhau nhưng khác nhau, tôi sẽ tóm tắt tất cả các cách khác nhau để tạo một thẻ.

  1. git rev-list -1 $TAG( trả lời ). git rev-listđưa ra các cam kết dẫn đến $TAGtương tự git lognhưng chỉ hiển thị SHA1 của cam kết. Các -1giới hạn đầu ra để cam kết nó chỉ vào.

  2. git show-ref --tags( câu trả lời ) sẽ hiển thị tất cả các thẻ (cục bộ và được tìm nạp từ xa) và SHA1 của chúng.

  3. git show-ref $TAG( câu trả lời ) sẽ hiển thị thẻ và đường dẫn của nó cùng với SHA1.

  4. git rev-parse $TAG( câu trả lời ) sẽ hiển thị SHA1 của thẻ không được quản lý.

  5. git rev-parse --verify $TAG^{commit}( câu trả lời ) sẽ hiển thị SHA1 của cả thẻ có chú thích và không được chú thích. Trên Windows sử dụng git rev-parse --verify %TAG%^^^^{commit}(bốn mũ).

  6. cat .git/refs/tags/*hoặc cat .git/packed-refs( câu trả lời ) tùy thuộc vào việc thẻ có cục bộ hay được tìm nạp từ xa hay không.


33

Sử dụng

git rev-parse --verify <tag>^{commit}

(sẽ trả về SHA-1 của một cam kết ngay cả đối với thẻ chú thích).


git show-ref <tag>cũng sẽ làm việc nếu <tag>không được chú thích. Và luôn luôn có git for-each-ref(xem tài liệu để biết chi tiết).


11
Tôi thích git rev-parse <tag>~0cái nào cũng có vẻ hoạt động và không yêu cầu thoát đặc biệt trên Windows (trong đó bốn chiếc mũ (^) là cần thiết thay vì một cái). Hậu tố ~<number>đưa ra cam kết cha mẹ <number>, do đó tự ~0sinh ra cam kết. Btw, ^0cũng là một tốc ký hợp lệ cho ^{commit}hậu tố sửa đổi.
Attila

15

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

git log -1 $TAGNAME

HOẶC LÀ

git log -1 origin/$TAGNAME

10

Để có được sha / hash của cam kết mà thẻ tham chiếu (không phải sha của thẻ):

git rev-list -1 <tag>


8

Tôi cũng muốn biết cách "đúng", nhưng trong lúc này, bạn có thể làm điều này:

git show mytag | head -1    

Với tiêu đề cam kếtgit show --oneline mytag | head -1
Stphane

7

Mặc dù điều này khá cũ, tôi nghĩ rằng tôi sẽ chỉ ra một tính năng thú vị mà tôi vừa tìm thấy cho các thẻ liệt kê với các cam kết:

git log --decorate=full

Nó sẽ hiển thị các nhánh kết thúc / bắt đầu tại một cam kết và các thẻ cho các cam kết.


4

Bạn cũng có thể có được hình ảnh dễ hiểu hơn về nơi các thẻ trỏ đến sử dụng

git log --graph |git name-rev --stdin --tags |less

và sau đó cuộn đến thẻ bạn đang tìm kiếm thông qua /.

Chế độ xem nhỏ gọn hơn ( --pretty=oneline) cộng với tất cả các đầu ( -a) cũng có thể giúp:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

Trông hơi đáng sợ, nhưng cũng có thể được đặt bí danh ~/.gitconfignếu cần thiết.

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

4

Câu trả lời ngắn sau Git-2

Tôi biết câu hỏi này đã được đưa ra ở đây khá lâu. Và câu trả lời từ CB Bailey là chính xác 100%:git show-ref --tags --abbrev

Tôi thích cái này hơn vì nó sử dụng git tag:

git tag --list --format '%(refname:short) %(objectname:short)'

Đơn giản. Ngắn.

PS bí danh nó như git taglistvới lệnh này:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"

3

Từ danh sách gửi thư git , đây là cách để có được danh sách băm cam kết cho các thẻ với chức năng hủy bỏ tự động cho các thẻ chú thích:

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

2

Điều này không hiển thị tên tệp, nhưng ít nhất bạn có cảm giác về kho lưu trữ.

cat .git/refs/tags/*

Mỗi tệp trong thư mục đó chứa một SHA cam kết trỏ đến một cam kết.


Điều này không hoạt động như tôi nghĩ, tôi đã kéo các thẻ từ xa. .git/packed-refsđã làm việc mặc dù.
Igor Zevaka

2

Tôi cũng muốn biết đúng cách , nhưng bạn luôn có thể nhìn trộm vào:

$ cat .git/packed-refs 

hoặc là:

$ cat .git/refs/tags/*

Đúng vậy, do đó, hành vi đối với ref-refs và refs / tags có phần khác nhau, pack-refs là một tệp văn bản chứa các thẻ và SHA, trong khi refs / tags / là một thư mục chứa các tệp văn bản được đặt tên theo thẻ chứa SHA. Tôi thực sự nghĩ rằng cách thích hợp để làm điều này là với git rev-list.
Igor Zevaka

2

Điều này sẽ giúp bạn băm SHA1 hiện tại

Cam kết viết tắt

git show <tag> --format="%h" --> 42e646e

Cam kết Hash

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

1
dường như không hoạt động trong phiên bản tôi có, nhưng git log <tag> -n 1 --pretty=%H
Andy

2

Nếu bạn muốn xem chi tiết về thẻ SOMETAG (tagger, ngày, v.v.), hàm băm của cam kết mà nó trỏ đến và một chút thông tin về cam kết nhưng không có khác biệt đầy đủ, hãy thử

git show --name-status SOMETAG

Ví dụ đầu ra:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....

0

Vì vậy, tôi có một tải các thư mục phát hành, trong đó các thư mục đó có thể được kiểm tra từ một trong một số repos khác nhau và có thể là nhánh dev, qa hoặc master hoặc có thể là bản phát hành sản xuất, được kiểm tra từ thẻ và thẻ có thể là chú thích hay không. Tôi có một đoạn script sẽ xem thư mục đích và nhận lại câu trả lời trong mẫu -. Vấn đề là các phiên bản khác nhau của git trả lại trạng thái khác nhau 'để kiểm tra thẻ.

Vì vậy, tôi thấy git show-ref --tagslàm việc ban đầu, ngoại trừ các thẻ chú thích. Tuy nhiên, việc thêm -d đã thêm một mục riêng vào danh sách các thẻ, một cho thẻ, một cho chú thích (cam kết chú thích được xác định là ^ {} mà tôi đã loại bỏ bằng sed).

Vì vậy, đây là cốt lõi của kịch bản của tôi, cho bất cứ ai muốn nó: -

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi

0

Có thể sử dụng dưới đây, nó sẽ cung cấp cho băm cam kết
git show -s --format=%H <tag>^{commit}

Nếu viết tắt cam kết băm yêu cầu, git show -s --format=%h <tag>^{commit}

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.