Git의 현재 지점에서 최신 태그 이름을 얻는 방법은 무엇입니까?


462

Git에서 가장 최근의 태그를 얻는 가장 간단한 방법은 무엇입니까?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

산출:

a
b
c

각 태그의 날짜 시간을 가져 와서 비교할 스크립트를 작성해야합니까?


1
커밋 날짜별로 주문한 최신 태그 또는 최신 태그? 수락 된 답변에 가장 최근에 생성 된 태그가 표시됩니다. existig 태그를 변경하기로 결정한 경우 이것은 문제가 될 수 있습니다 ...
Paebbels

답변:


412

git describe요청한 내용에 가까운 것을 수행하는을 살펴볼 수 있습니다 .


194
으로 --abbrev=0는 가장 가까운 반환해야 주석 태그
야쿱 Narębski

13
현재 분기
brittohalloran

42
현재 브랜치 에서 현재 커밋만을 대상으로 하는 최신 주석이 달린 태그 를 얻으려면을 사용하십시오 . git describe --exact-match --abbrev=0
Naftuli Kay

5
이 답변은 의견과 함께 올바른 태그를 제공하지 않았습니다. @kilianic은 올바른 해결책을 제공했습니다.
Herman J. Radtke III

19
git describe --tags그리고 github 릴리스 페이지의 마지막 태그 비교
Adriano Resende

627

가장 최근의 태그를 얻으려면 :

git describe --tags

가장 최근에 주석이 달린 태그 를 얻으려면 :

git describe --abbrev=0

2
그래, 맨 페이지에 git describe나와있는 것처럼 : --abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
조르고 스 Kylafas

22
아니면 그냥git describe --tags
james_womack

5
동일한 커밋을 가리키는 두 개의 태그가 있으면이 답변 (및 아마도 다른 것)이 문제가 발생합니다. 태그에 주석이 달린 태그가 아니라면 git이 이전에 생성 된 둘 중 어느 것을 구별 할 수있는 방법이 없다고 생각합니다.
Paul Lynch

10
이것이 정답입니다. 제출해 주셔서 감사합니다.
crmpicco

6
가장 최근의 태그를 직접 체크 아웃하려면 :git checkout $(git describe --abbrev=0 --tags)
JohnRDOrazio

321

모든 브랜치에서 최근 태그가 지정된 커밋의 태그를 출력합니다

git describe --tags $(git rev-list --tags --max-count=1)

8
또는 TAG=$(git describe --tags $(git rev-list --tags --max-count=1))@ william-pursell
kilianc

20
이것이 가장 좋은 대답입니다. 현재 "올바른"답변과 같이 현재 지점뿐만 아니라 모든 지점에서 태그를 가져옵니다.
brittohalloran

61
질문을 제외하고는 현재 지점을 구체적으로 요구합니다.
michaeltwofish

3
@ michaeltwofish, 그것을 알지 못했을 때, 나는 그것을 알아 차리고 그에 따라 내 대답을 수정했습니다. 미안합니다.
kilianc

3
참고 :이 명령은이 태그가 다른 분기에 있더라도 "최신"태그를 반환합니다.
Alan Zhiliang Feng

47

가장 최근의 태그를 얻으려면 다음을 수행하십시오.

$ git for-each-ref 심판 / 태그 --sort = -taggerdate --format = '% (refname)'--count = 1

물론 count 인수 또는 정렬 필드를 원하는대로 변경할 수 있습니다. 약간 다른 질문을했을 수도 있지만 해석 할 때 질문에 대한 답변이됩니다.


2
이것은 거의 내가 찾던 것 (모든 지점에서 가장 최근의 태그)이지만 적어도 내 버전의 git (1.7.7.6)을 사용하면 태그 --sort=-authordate--sort=authordate.
Larsks

3
아하, 당신이 실제로 원하는 것은 --sort=-taggerdate입니다. 태그의 경우 authordatecommitterdate빈 (정렬 키와 그렇게 쓸모가) 있습니다.
larsks

8
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1더 낫다 :)
Christophe Eblé

5
실제로, 주석없이 거의 5 세의 완벽하게 정답을 하향 조정합니까? 그냥 무례합니다.
William Pursell

1
그리고 --points-at=$SHA커밋 해시 태그를 제공합니다.
Ryan

34

이건 어때요?

TAG=$(git describe $(git rev-list --tags --max-count=1))

기술적으로, 반드시 최신 태그를 얻을 필요는 없지만 원하는 태그가있는 최신 커밋은 필요하지 않을 수도 있습니다.


이것은 현재 브랜치에서 최신 태그를 얻지 못하지만 모든 브랜치에 적용됩니다. 어느 것이 좋았는지, 내가 정확히 필요한 것입니다. 감사합니다 Wincent.
jasongregori

2
태그 일치 패턴이 필요한 경우 --tags=<pattern>에서 사용할 수 있습니다 rev-list. 예를 들어, 마지막 버전 태그git describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
Wirone

1
$ (git describe --contains $ (git rev-parse HEAD))
Vaidas Zilionis 2016 년

고맙지 만, 효과가 있었지만 태그를 추가해야했습니다. git describe --tags $(git rev-list --tags --max-count=1)
Gianluca Casati

25

실행할 수 있습니다 : git describe --tags $(git rev-list --tags --max-count=1)여기에서 이야기 : 최신 태그 이름을 얻는 방법?


나는 최고 / 허용 된 답변으로 시작하여 내려왔다. 이것은 실제로 저에게 최신 태그를 제공하는 첫 번째 답변입니다 (왜 오래된 git describe ...것이 이전 태그를 반환 하는지 확실하지
Jeremy Davis

이것은 나를 위해 작동하는 유일한 것입니다. --abbrev=0답변 중 일부를 시도 하고 원하는 태그의 일부를 잘라 냈습니다.
Luke Davis

22

"가장 최근"은 git과 관련하여 두 가지 의미를 가질 수 있습니다.

"태그 생성 날짜가 최신 인 태그"를 의미 할 수 있으며 여기에있는 대부분의 답변이 해당 질문에 대한 것입니다. 질문의 관점에서 tag를 반환하려고합니다 c.

또는 "어떤 태그가 개발 기록에서 일부 지명 된 지사에 가장 가까운 지", 일반적으로 사용중인 지사를 의미 할 수 있습니다 HEAD. 귀하의 질문에 이것은 tag를 반환 a합니다.

이것들은 물론 다를 수 있습니다 :

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

개발자가 tag'ed 상상 Z으로 v0.2월요일에, 다음 tag'ed Q으로 v0.1화요일에. v0.1가장 최근이지만 v0.2HEAD에 더 가까운 지점에서 시작한다는 점에서 HEAD에 대한 개발 기록이 더 가깝습니다.

나는 일반적으로 개발 역사에서 더 가까운 두 번째 대답을 원한다고 생각합니다. git log v0.2..HEAD각 태그에 대해 etc를 사용하여 찾을 수 있습니다 . 경로에서 끝나는 v0.2경로와 HEAD가 뒤 따르기 때문에 HEAD에 대한 커밋 수를 제공합니다 .

이 검사를 실행하는 모든 태그를 반복 한 다음 태그 경로가 분기 된 후 HEAD에서 커밋이 가장 적은 태그를 인쇄하여이를 수행하는 Python 스크립트는 다음과 같습니다.

https://github.com/MacPython/terryfy/blob/master/git-closest-tag

git describeHEAD에서 히스토리의 경로에있는 첫 번째 태그를 찾기 위해 HEAD에서 추적한다는 점에서 약간 다른 작업을 수행합니다. git 용어 git describe로 HEAD에서 "연결 가능한"태그를 찾습니다. 따라서 v0.2HEAD에서 되돌아 오는 경로가 아닌 다른 태그를 찾을 수 있습니다.


21

git describe --tags

현재 브랜치에서 볼 수있는 마지막 태그를 반환


15
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '

하나 이상의 마지막 태그보다 더 필요한 경우

(git describe --tags는 때때로 잘못된 해시를 제공합니다. 왜 그런지 모르겠지만 저에게는 --max-count 2가 작동하지 않습니다)

이것은 당신이 역순으로 최신 2 태그 이름을 가진 목록을 얻는 방법이며, git 1.8.4에서 완벽하게 작동합니다. 이전 버전의 git (예 : 1.7. *)의 경우 출력에 "tag :"문자열이 없습니다. 마지막 sed 호출 만 삭제하십시오.

최신 태그를 두 개 이상 원하는 경우이 "sed 2q"를 "sed 5q"또는 필요한 항목으로 변경하십시오.

그런 다음 모든 태그 이름을 변수 등으로 쉽게 구문 분석 할 수 있습니다.


이것은 실제로 유용합니다. 많은 개발자가 배포가 중단되면 이전 태그로 롤백하여 릴리스 프로세스를 자동화하려고 시도합니다. 멋진 물건 !!!
AkD

1
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p' 여기에서 더 나아가서 : in %D은 주변 ()문자 를 제외하고 sed5q로 시작 하는 s는 5 앞에 4 줄을 남기고 'tag :`와 첫 번째', '사이의 모든 문자를 인쇄합니다. 태그 안에 쉼표를 사용하지 않는다고 가정하면 완벽하게 작동합니다.
Cometsong

14

모든 제안에서 무엇이 잘못 되었습니까 ( Matthew Brett 설명을 제외 하고이 답변 게시물의 최신 내용)?

그냥 jQuery를 망할 놈의 기록에 다른에서 제공하는 모든 명령을 실행할 때 당신을에서 역사의 다른 지점 으로 체크 결과 시각적 태그 이력 표현 (나는 당신이이 포스트를 볼 이유입니다) :

$ git log --graph --all --decorate --oneline --simplify-by-decoration

오늘날 많은 프로젝트 는 mainline과 별도의 브랜치에서 릴리스 (따라서 태그 지정) 수행합니다 .

이에 대한 강력한 이유 가 있습니다 . 잘 확립 된 JS / CSS 프로젝트를 살펴보십시오. 사용자 규칙에 따라 이진 / 최소 릴리스 파일을 DVCS로 전달합니다. 당연히 프로젝트 관리자로서 쓸모없는 바이너리 블롭으로 메인 라인의 diff history 를 쓰레기 로 만들고 메인 라인 에서 빌드 아티팩트를 커밋 하고 싶지 않습니다 .

Git은 선형 이력이 아닌 DAG를 사용하기 때문에 거리 측정법을 정의 하기가 어렵습니다. 그래서 우리는 말할 수 있습니다 HEAD.

나는 내 자신의 여정을 시작합니다 (내부에서,이 긴 게시물에 멋진 증거 이미지를 복사하지 않았습니다).

Git에서의 브랜칭과 관련하여 과거에 가장 가까운 태그는 무엇입니까?

현재 태그와 개정 사이의 거리에 대한 유용한 정의가 유용성이 감소했습니다.

  • 최단 경로의 길이 에서 HEAD병합베이스 태그
  • 와 태그 사이 의 병합 기준 날짜HEAD
  • 회전 속도를 올린다 수 그 HEAD에서 연결할 수 있지만 태그에서 도달 할 수없는
  • 병합 기준에 관계없이 태그의 날짜

최단 경로의 길이 를 계산하는 방법을 모르겠습니다 .

태그 사이 의 병합 기준 날짜 에 따라 태그를 정렬하는 스크립트 :HEAD

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort

대부분의 프로젝트에서 사용할 수 있습니다.

HEAD에서는 도달 할 수 있지만 태그에서는 도달 할 수없는 회전 수에 따라 태그를 정렬하는 스크립트 :

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

프로젝트 히스토리에 커밋 날짜가 이상한 경우 (리베이스 또는 다른 히스토리 재 작성 또는 일부 moron이 BIOS 배터리 또는 히스토리에서 수행하는 다른 마술을 교체하는 것을 잊어 버렸기 때문에) 위의 스크립트를 사용하십시오.

날짜 별로 정렬 된 태그 목록을 얻는 마지막 옵션 ( 병합 기준에 관계없이 태그 날짜)의 경우 :

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

알려진 최신 개정 날짜를 얻으려면 다음을 사용하십시오.

$ git log --max-count=1

참고 git describe --tags자신의 경우에 있지만 찾기 위해 사용이 인간의 프로젝트의 역사에서 가장 가까운 태그를 예상 .

참고 모든 레시피에서 위의 레시피를 사용할 수 있습니다 HEAD. 원하는 것으로 바꾸십시오 !


12

git describe --abbrev=0 --tags

최신 태그가 표시되지 않으면 해당 태그를 실행하기 전에 원본을 가져와야합니다.

git remote update


12
git tag -l ac* | tail -n1

접두사가 "ac"인 마지막 태그를 가져옵니다 . 예를 들어,으로 이름이 지정된 태그 ac1.0.0또는 ac1.0.5. 라는 이름의 다른 태그 1.0.0, 1.1.0무시됩니다.

git tag -l [0-9].* | tail -n1

첫 번째 문자가 인 마지막 태그를 가져옵니다 0-9. 따라서 첫 번째 문자 a-z가 있는 태그 는 무시됩니다.

더 많은 정보

git tag --help # Help for `git tag`

git tag -l <pattern>

주어진 패턴과 일치하는 이름을 가진 태그를 나열하십시오 (또는 패턴이 제공되지 않은 경우 모두). 인수없이 "git tag"를 실행하면 모든 태그가 나열됩니다. 패턴은 쉘 와일드 카드입니다 (즉, fnmatch (3)을 사용하여 일치). 여러 패턴이 제공 될 수 있습니다. 둘 중 하나라도 일치하면 태그가 표시됩니다.


tail -n <number> # display the last part of a file
tail -n1 # Display the last item 

최신 정보

와 함께 인수 git tag --help에 대해 속성이 존재하지 않으면 기본적으로 sort사용 lexicorgraphic order됩니다 tag.sort.

정렬 순서의 기본값은 tag.sort 변수에 대해 구성된 값 (있는 경우), 그렇지 않으면 사전 순서입니다. git-config (1)를 참조하십시오.

구글 이후, 누군가는 git 2.8.0이 다음과 같은 구문을 지원 한다고 말했다 .

git tag --sort=committerdate

나에 대한하지 냄비는 지난 태그는 2.11.174하지만 일종의 때문에하지 버전 등이 인쇄 2.11.99
Ali.MD

8
git tag --sort=committerdate | tail -1

코드 전용 답변을 게시하는 대신이 코드 스 니펫이 어떻게 문제를 해결하는지 설명하십시오.
Arun Vinoth

5

다음은 마지막 두 태그가 필요한 경우 (예 : 현재 태그와 이전 태그 사이에 변경 로그를 생성하기 위해) 작동합니다. 최신 태그가 인 상황에서만 테스트했습니다 HEAD.

PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`

GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`

그것은 내 요구에 적합하지만 git 마법사가 아니기 때문에 더 향상 될 수 있다고 확신합니다. 또한 커밋 히스토리가 진행될 경우 중단 될 것으로 의심됩니다. 누군가를 도울 수 있도록 공유하고 있습니다.


4

내 첫 번째 생각은을 사용할 수 있다는 git rev-list HEAD것입니다 git tag --contains. git tag --contains비어 있지 않은 목록을 생성 하는 참조를 찾으면 가장 최근의 태그를 찾았습니다.


4

특정 분기에 적용된 마지막 태그를 찾으려면 다음을 시도하십시오.

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")

3

현재 브랜치 에서 최신 태그 이름 (태그 날짜 기준) 을 가져 오는 하나의 라이너가 필요한 경우 :

git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD

이를 사용하여 설정에서 버전 번호를 설정합니다.

출력 예 :

v1.0.0

Windows에서도 작동합니다.


1
리눅스 (데비안 스트레치)에 나는 얻을-bash: syntax error near unexpected token '('
제레미 데이비스

1
해당 부분을 따옴표로 묶어 (예 --format="%(refname:short)":) 건너 뛰면 --points-at=HEAD작동합니다. 마지막 스위치를 사용하면 아무것도 반환 HEAD되지 않습니다.
Jeremy Davis

@JeremyDavis, 그렇습니다 HEAD. 왜냐하면 귀하의 태그가 없기 때문 입니다.
Markus

2

이것은 오래된 스레드이지만 많은 사람들이 OP의 질문에 대한 가장 간단하고 쉽고 가장 정확한 답변을 누락 한 것 같습니다 : 현재 분기 의 최신 태그를 얻으려면 을 사용하십시오 git describe HEAD. 끝난.

편집 : 당신은 또한 유효한 참조 이름을 제공 할 수 있습니다, 심지어 리모컨; 즉, git describe origin/master출발지 / 마스터로부터 도달 할 수있는 최신 태그를 알려줍니다.


"가장 최근의 태그"가 모든 지점에서 처리된다는 보장은 없습니다. 두 작업 솔루션은 있습니다 for-each-ref명령 ( stackoverflow.com/a/5261470/515973 )과의 조합 rev-listdescribe( stackoverflow.com/a/7979255/515973 )
줄리앙 Carsique

1
이것은 가장 최근의 태그를 얻지 못합니다.
K-SO의 독성이 증가하고 있습니다.

git describe branchname --tags분기에서 최신 태그를 얻는 데
도움이됩니까

0

현재 분기가 앞에 붙는 현재 분기 / 태그 이름에서만 최신 태그를 얻으려면 다음을 실행해야했습니다.

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH

지점 마스터 :

git checkout master

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

master-1448

지점 사용자 정의 :

git checkout 9.4

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

9.4-6

그리고 마지막으로 다음 태그 지정을 위해 태그 +1을 증가시키고 가져와야합니다.

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags  --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'

0

질문에 따라

현재 브랜치에서 최신 태그 이름을 얻는 방법

너는 원해

git log --first-parent --pretty=%d | grep -m1 tag:

--first-parent알 수 git log있는 역사를 합병 세부 사항에없는, --pretty=%d오직 장식이 어떤 커밋에 대한 지역의 이름을 즉 보여 말한다. grep -m1"단지 하나만 일치"라고 표시되므로 가장 최근의 태그 만 얻을 수 있습니다.


0

태그를 정렬 할 수있는 경우 :

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1

0

주석이 달린 태그와 주석이 달린 태그에 대해서는 언급하지 않았습니다. '설명'은 주석이 달린 태그에서 작동하며 주석이없는 태그는 무시합니다.

이것은 추악하지만 요청 된 작업을 수행하며 다른 분기에서 태그를 찾지 못합니다 (아래 예의 master : 명령에 지정된 태그가 아님).

필터링은 최적화 (통합)되어야하지만 다시 한 번 작업으로 보입니다.

git log  --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1

내가 이것을 사용하려고 지금 비평가는 환영합니다 :)


-2

최신 태그 이름 을 얻는 또 다른 간단한 방법 은

git tag | tail -1

또는

TAG=$(git tag | tail -1)

변수에 저장하십시오.

git tag사용 가능한 모든 태그를 나열 하고 결과 인 경우 가장 마지막 행을 반환합니다.tail-1


4
정렬하지 않으면 이것은 나쁜 움직임입니다.
mjd2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.