it-swarm.dev

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

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

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

산출:

a
b
c

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

394
culebrón

당신은 git describe을 살펴볼 수 있습니다.

368
JB.

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

git describe --tags

가장 최근 주석이 달린 태그를 얻으려면 다음을 수행하십시오.

git describe --abbrev=0
557
acassis

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

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

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

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

물론 카운트 인수 나 정렬 필드를 원하는대로 변경할 수 있습니다. 약간 다른 질문을하는 의미일지도 모르겠지만, 제가 해석 할 때이 질문에 대답합니다.

37
William Pursell

이것은 어떤가요?

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

엄밀히 말하자면, 반드시 최신 태그를 얻지는 않지만 태그가 붙은 최신 커밋이 당신이 찾고있는 것이거나 아닐 수도 있습니다.

28
Wincent Colaiuta

git describe --tags

현재 가지에서 볼 수있는 마지막 태그를 반환합니다.

21
beenhere4hours

"가장 최근"는 git의 관점에서 두 가지 의미를 가질 수 있습니다.

당신은 "어느 태그가 최신의 작성 날짜를 가졌는지"를 의미 할 수 있습니다. 그리고 대부분의 대답은 그 질문을위한 것입니다. 질문에 관해서는 c 태그를 반환하고 싶을 것입니다.

또는 "어떤 태그가 개발 지 역사상 가장 가까운 지사인지"를 의미 할 수 있습니다. 일반적으로 지사는 HEAD입니다. 귀하의 질문에,이 a 태그를 반환합니다.

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

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

월요일에 개발자가 Zv0.2로 태그 한 다음 화요일에 v0.1로 tag'ed Q을 (를) 상상해보십시오. v0.1는 최근 버전이지만 v0.2는 개발 기록에서 HEAD에 더 가깝습니다. 즉, HEAD에 가까운 지점에서 시작됩니다.

제 2의 대답을 원한다고 생각합니다. 개발 역사에 더 가깝습니다. 각 태그에 대해 git log v0.2..HEAD 등을 사용하여 찾을 수 있습니다. v0.2로 끝나는 경로가 HEAD에 이어지는 경로에서 분기 되었기 때문에 HEAD에 대한 커밋 수를 제공합니다.

다음은이 검사를 실행하는 모든 태그를 반복 실행 한 후 HEAD에 가장 적은 커밋으로 태그를 출력하는 Python 스크립트입니다. 태그 경로가 분기 되었기 때문입니다.

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

git describe는 HEAD에서 기록에있는 경로에있는 첫 번째 태그를 찾기 위해 예를 들어 HEAD에서부터 뒤로 추적한다는 점에서 약간 다른 점이 있습니다. git 용어로 git describe는 HEAD로부터 "도달 가능한"태그를 찾습니다. 따라서 v0.2와 같은 태그는 HEAD의 경로에 있지 않지만 경로는 거기에서 벗어났습니다.

20
Matthew Brett

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

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

하나 이상의 마지막 태그가 필요한 경우

(자식 설명 - 태그 가끔 잘못된 해시를 제공, 내가 왜,하지만 나를 위해 - 맥스 - 카운트 2 나던 작품을 몰라)

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

2 개 이상의 최신 태그를 원할 경우 - "sed 2q"를 "sed 5q"또는 원하는대로 변경하십시오

그러면 변수마다 모든 태그 이름을 쉽게 파싱 할 수 있습니다.

13
east

모든 제안과 함께 wrong은 무엇입니까 (- Matthew Brett 설명,이 답변 게시물의 최신 설명 제외)?

다른 히스토리 지점 에있을 때 jQuery Git 히스토리에서 다른 명령을 실행하고 visual tagging history representation (I did 그렇기 때문에이 게시물이 표시됩니다) :

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

오늘날 많은 프로젝트는 릴리스를 수행하여 태그를 지정합니다. 본선과 분리 된 지점에서.

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

Git은 선형 히스토리가 아닌 DAG를 사용하기 때문에 거리 측정을 정의하기 어렵다라고 말할 수 있습니다.-rev는 내 HEAD에 가장 가깝습니다!

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

Git의 분기와 관련하여 과거에 가장 가까운 태그는 무엇입니까?

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

  • 최단 경로 길이HEAD에서 병합 기준
  • 날짜 of 병합 기준 HEAD와 태그 사이
  • 회전 수 HEAD에서 도달 할 수 있지만 태그에서 도달 할 수없는
  • 날짜 태그에 관계없이 병합 기준

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

HEAD과 태그 사이에서 date of merge base 에 따라 태그를 정렬하는 스크립트 :

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

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

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

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

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

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

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

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

$ git log --max-count=1

git describe --tags은 (는) 자체적으로 용도가 있지만 프로젝트 히스토리에서 사람이 예상 한 가장 가까운 태그를 찾는 데는 사용되지 않습니다.

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

12
gavenkoa
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 --helpsort 인수에 관한 것입니다. lexicorgraphic order 속성이 없으면 기본적으로 tag.sort를 사용합니다.

정렬 순서의 기본값은 tag.sort 변수가있는 경우 기본값으로 설정되고, 그렇지 않으면 사전 식 순서입니다. git-config (1)를 참조하십시오.

구글 후, 누군가 말한 git 2.8.0 지원 구문.

git tag --sort=committerdate
10
AechoLiu

git describe --abbrev=0 --tags

최신 태그가 표시되지 않으면 Origin을 가져 오기 전에 Origin을 가져와야합니다.

git remote update

9
Walter B

다음 두 가지 태그가 필요하면 (예를 들어, 현재 태그와 이전 태그 사이의 변경 로그를 생성하기 위해) 다음과 같이 작동합니다. 나는 최신 태그가 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_"`

그것은 나의 필요에 어울리지 만, 나는 자식 마법사가 아니기 때문에 그것이 더 향상 될 수 있다고 확신한다. 나는 또한 커밋 히스토리가 앞으로 나아갈 경우를 대비해 깨어있을 것이라고 생각한다. 나는 누군가를 돕는 경우에 대비해 공유하고 있습니다.

5
Ivan Vučica

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

git describe --tag $(git rev-parse --verify refs/remotes/Origin/"branch_name")
3
Scyssion

내 첫 번째 생각은 당신이 git rev-list HEAD와 결합하여 역순으로 모든 rev를 나열하는 git tag --contains를 사용할 수 있다는 것입니다. git tag --contains가 비어 있지 않은 목록을 생성하는 ref를 찾으면 가장 최근의 태그를 찾았습니다.

3
Greg Hewgill

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

편집 : 당신은 또한 유효한 명사를 제공 할 수 있습니다 심지어 원격; 즉, git describe Origin/master는 Origin/master에서 도달 할 수있는 최신 태그를 알려줍니다.

1
dohpaz42

태그가 정렬 가능한 경우 :

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

묻는대로,

현재 분기에서 최신 태그 이름을 얻는 방법

너는 원한다.

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

--first-parentgit log에 병합 된 기록을 표시하지 않고 --pretty=%d는 꾸미기의 장식 즉 로컬 이름만을 표시합니다. grep -m1는 "하나만 일치"라고 말합니다. 따라서 가장 최근 태그 만 가져올 수 있습니다.

0
jthill

현재 분기 접두사가 붙은 현재 분기/태그 이름에서만 최신 태그를 가져 오려면 다음을 실행해야했습니다.

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
147.3k

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

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

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

출력 예 :

v1.0.0

Windows에서도 작동합니다.

0
Shivan