Git 태그 목록, 커밋 sha1 해시 표시


101

따라서 git tag명령은 현재 git 태그를 나열합니다.

tag1
tag2

git tag -n 태그의 메시지를 인쇄

tag1  blah blah
tag2  blah blah

tag1 및 tag2의 해시를 얻는 가장 좋은 방법은 무엇입니까?


1
개별적으로 묻는 질문은 아니지만 왜 git tag( -n또는 다른 옵션 ...)이 커밋 해시를 표시하지 않는지 궁금 합니다. 사람들이 어떤 솔루션을 제시하는지 보는 것은 좋지만, 나는 이것이 가능한 옵션의 디자인 결함이라고 생각합니다.
andreee

답변:


142

Tag 객체의 SHA1 해시로 git 태그를 얻으려면 다음을 실행할 수 있습니다.

git show-ref --tags

그러면 출력은 다음과 같습니다.

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

각 줄은 태그의 SHA1 해시이며 뒤에 refs/tags/.

태그 개체 대신 커밋의 SHA1 해시를 원하면 다음을 실행할 수 있습니다.

git show-ref --tags -d

그러면 다음과 같은 출력이 생성됩니다.

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

^{}시작으로 끝나는 줄 은 태그가 가리키는 실제 커밋의 SHA1 해시 로 시작합니다.


7
이것은 경량 태그와 주석이 달린 태그를 구분하지 않습니다. 경량 태그의 경우 커밋을 표시하고 주석이 달린 태그의 경우 태그 객체 자체의 해시를 표시합니다.
Lily Ballard 2012 년

20
역 참조 된 참조가있는 태그 목록을 표시하려면 (주석이있는 태그의 경우)을 사용하십시오 git show-ref --tags -d. 역 참조 된 태그는 ^{}.
S. Christoffer Eliesen 2012

49

git tag명령은 저개발이다. 커밋 내역 순서의 전체 태그 세부 정보 및 태그와 같이 많은 것이 필요하지만 누락되었습니다.

대신 내가 원하는 것을 정확히 제공하지만 얻을 수는 없습니다 git tag.

git log --oneline --decorate --tags --no-walk

이렇게하면 전체 로그에있는 것처럼 시간 역순으로 태그의 매우 멋진 색상 코드보기가 제공됩니다. 이렇게하면 태그를 볼 수있을뿐만 아니라 축약 된 해시와 태그 커밋의 커밋 메시지도 볼 수 있습니다.


나는 그것을 별칭 한 git tgit tags다음과 같습니다 :

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

참고 : Git이 다른 별칭에서 별칭을 호출하는 것을 지원하지 않기 때문에 bash 리디렉션을 사용해야했습니다 git t.


커밋 날짜와 시간을 보려면 다음을 시도하십시오.

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

--date옵션 에서 다른 날짜 형식을 사용할 수있을 뿐만 아니라 옵션의 고유 한 취향에 맞게 출력을 완전히 제어 할 수 --pretty있습니다. 두 옵션 모두 git-log Documentation 에 잘 설명되어 있습니다.


2
OP가 요청한 내용은 아니지만 (display commit sha1 hashes ) 커밋 메시지도 편리 할 수 ​​있으므로 매우 유용합니다. 나에게서 +1.
Stelios Adamantidis

2
@nealmcb git log는 강력합니다! 원하는 것을 정확하게 보여줄 수 있습니다 . 시도해보십시오 git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. 다른 날짜 형식도 가능합니다. --date도움말 페이지에서 찾아보세요 . 이 옵션을 포함하도록 답변을 업데이트했습니다.
ADTC 2011

1
@SteliosAdamantidis 실제로 내 대답은 축약 된 SHA1 해시 (처음 7 자)를 제공하며, 전체 길이 해시를 원하는 경우 언제든지 --pretty및을 사용 하여 수정할 수 있습니다 %H. +1 감사합니다 :)
ADTC

15

주석이 달린 태그에는 자체 SHA-1이 있으므로 역 참조해야합니다. 그러나 경량 태그는 이미 커밋을 가리 키므로 역 참조 할 수 없습니다. 해결하려면 두 가지를 모두 나열하고 커밋 객체를 필터링해야합니다.

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

경량 태그를 사용한 결과 :

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

주석이 달린 태그가있는 결과 :

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}

을 사용 git log --tags --oneline --no-walk하면 주석이 달린 태그도 자동으로 따릅니다. :)
ADTC 2011

11

모든 종류의 참조 (분기, 태그 ...)에서 참조하는 SHA1을 얻으려면 다음을 사용하십시오 git rev-parse.

git rev-parse tag1^0 tag2^0

별도의 줄에 전체 SHA1 만 인쇄합니다. ^0접미사는 태그가 가리키는 커밋의가 주석 여부이든이의 SHA1을 인쇄 할 수 있도록 특수 구문입니다. (주석이있는 태그는 메타 데이터와 함께 커밋에 대한 포인터를 포함하는 자체 권한의 객체입니다. 태그에 주석이 달린 것을 알고 있고 태그의 SHA1을 원하는 경우 ^0.)

물론 SHA1을 허용하는 모든 Git 명령도 태그를 허용해야하므로이 작업을 자주 수행 할 필요는 없습니다!


여기에 최고의 답변, 감사합니다 @Jefromi. Windows cmd 쉘에서 ^를 사용하는 모든 git 명령은 인용되어야합니다. 예 : git rev-parse "tag1 ^ 0" "tag2 ^ 0".
yoyo

8

비슷한 질문이 있었지만 (여러) 특정 태그의 해시를 원했습니다. "show-ref"가 태그 목록을 가져 오므로이 작업을 수행합니다.

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

그러나 "git show"를 사용한 몇 가지 실험 결과 다음 명령이 나왔습니다.

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

"show-ref"보다 "show"를 사용하는 것이 훨씬 더 익숙하기 때문에 후자가 기억하기 쉽고 더 도움이됩니다.

Git에서 태그가 가리키는 커밋을 확인하는 방법 의 멋진 요약을 참조하십시오 . .


3

태그는 서명 및 / 또는 메시지를 보내야합니다. 경량 태그에는 SHA1 개체가 없으며 단지 참조 일뿐입니다. 그렇지 않으면 시도하십시오 git show.


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

이것은 태그에 대한 모든 커밋 목록을 제공합니다. 주석이 달린 태그는 역 참조됩니다. 여기에 감사를 보냅니다 .


훌륭한 솔루션. 전체 참조 이름 대신 tagenames 만 사용하려면 %(refname:short)대신 %(refname).
Radon8472

2

나는 anatoly techtonik 게시물 에서 명령을 받아 태그 / 커밋의 헤드 라인 메시지를 추가하고 멋진 cols로 형식을 지정했습니다.

결과는 동일한 출력 git tag -n이지만 commit-hash를 접두어로 사용합니다.

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

짧은 대신 긴 해시를 사용하려면 yust objectname:shortobjectname.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.