주어진 git 커밋과 관련된 태그를 찾는 방법은 무엇입니까?


90

릴리스의 경우 일반적으로 v1.1.0과 같은 태그를 지정합니다. 빌드 스크립트 중에 현재 git 정보가 포함 된 fwVersion.c 파일을 만들고 있습니다. 현재 파일에 커밋 및 분기 정보가 있지만 태그를 추가하고 싶습니다.

이것이 가능한가?

답변:


115

에 대한 설명서를 확인하십시오 git describe. 주어진 커밋에 가장 가까운 태그 (즉, 커밋의 조상을 가리키는 태그)를 찾고 태그 측면에서 해당 커밋을 설명합니다.

커밋이 태그로 가리키는 지 여부 만 알고 싶다면 다음 출력을 확인할 수 있습니다.

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

32
git describe --tags <commit-id>주석이없는 태그 용
Aleksandr Levchuk 2011-09-24

1
나는 이것을 사랑한다. 특히, 나는 현재 개정판에서 사람이 읽을 수있는 것을 얻을 수 있다는 것을 좋아합니다.git describe --all --exact-match `git rev-parse HEAD`
dsummersl

5
최신 버전에서는 git describe --tags --abbrev=0 REV태그에 정크를 원하지 않을 때 유용합니다.
Craig Ringer

1
git describe --all(현재 체크 아웃 된 커밋의 경우) 또는 git describe --all <commit>내가 원했던 거의 모든 것을 항상 수행했습니다.
rfay 2014

git에서 버전을 사용하는 가장 좋은 부분은 소프트웨어가 배포 될 때 소스에서 버전을 더 이상 하드 코딩하지 않는다는 것입니다. 가장 가까운 태그를 찾는 git describe의 방법을 사용하여 다음 버전 번호를 계산하고 repo 및 패키지 이름에 태그 참조를 추가 할 수 있습니다.
Sid

63

원하는 것이 커밋을 포함하는 첫 번째 태그 인 경우 :

git describe --contains <commit>

최고의 답변 IMO를 제공합니다. 큰 저장소의 오래된 커밋에서 "git tag --contains"를 사용하는 것보다 자주 태그가있는 경우 실행하는 데 시간이 걸릴 수 있으며 해당 커밋을 포함하는 모든 태그를 제공 할 수 있습니다.

이 형식의 git describe는 매우 빠르게 실행되며 커밋을 포함하는 첫 번째 태그 인 단일 출력 값과 커밋이 얼마나 뒤로 돌아 갔는지 제공합니다.


27

이건 어때?

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

주어진 커밋에있는 모든 태그를 제공하고 ( git describe단 하나만 제공함) 하위 커밋에 태그를 포함하지 않습니다 git tag --contains.


stderr에 오류 메시지가 기록되지 않기 때문에 이것을 좋아합니다. 감사.
Basuke

23

이 정보는 매뉴얼에서 찾을 수 있습니다.

git tag --contains <commit>

3
이것은 주어진 커밋을 포함하는 모든 태그를 나열 할 것입니다 (즉, 주어진 커밋의 자식을 가리키는 태그). 목록에는 단일 커밋 만 포함됩니다.
CB Bailey

4
찰스 베일리가 위에서 말했듯이, 그것은 정확히 제가 찾고있는 것이 아닙니다. 아마도 당신은 RTFM해야 할 것입니다 :)
wes

1
글쎄, 오답에 대해 죄송합니다. 내가 확인했을 때 당신이 요청한 것을하는 것 같았습니다. RTFM을했는데 잘못된 문제를 해결하는 중이었습니다. Hope Bailey는 도움이되는 솔루션을 제공했습니다.
dharga

6
그래서 git 질문을하기 전에 전체 git 매뉴얼을 읽을 필요가 없습니다. 구글 인덱스 훨씬 더 어떤 자식 매뉴얼 페이지가 아닌 ...
aaronstacy

13

나는 내가 원하는 것을주기 위해 두 가지 상위 답변의 콤보를 찾았습니다.

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

이렇게하면 해당 커밋과 주석이없는 커밋에만 해당하는 태그가 제공됩니다. 태그를 찾고 싶을 때 유용합니다 (예 : Jenkins의 경우).

예. $ git describe --tags --exact-match head~2

제공합니다 :

$ ReleaseBeta

0

일부 답변 통합 :

git tag --contains [<ref>]

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

아니면 그냥

git tag

동일하게 작동하여 지정된 참조 또는 지정되지 않은 경우 현재 커밋에 대한 모든 태그를 인쇄합니다.

git describe --tags [<ref>]

여기서 <ref>기본값은 현재 커밋이고, 커밋과 연관된 태그가 없으면 128로 종료하고 커밋과 연관된 태그를 인쇄합니다 (패턴이없는 것 같음).

git describe [<ref>]--tags주석이 달린 태그 만 인쇄한다는 점 을 제외하면 with와 동일하게 작동합니다 .

옵션 --contains을 제공하면 describe지정된 커밋의 조상과 관련된 태그가 인쇄됩니다. 예를 들면

$ 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

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