문제

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

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

산출:

a
b
c

각 태그의 datetime을 얻고 비교하기 위해 스크립트를 작성해야합니까?

도움이 되었습니까?

해결책

당신은 볼 수 있습니다 git describe, 그것은 당신이 요구하는 것에 가까운 무언가를합니다.

다른 팁

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

git describe --tags

가장 최근에 얻으려면 주석 꼬리표:

git describe --abbrev=0

모든 지점에서 최신 태그 커밋의 태그를 출력합니다.

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

가장 최근의 태그를 얻으려면 다음을 수행 할 수 있습니다.

$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1

물론 원하는대로 카운트 인수 또는 정렬 필드를 변경할 수 있습니다. 당신은 약간 다른 질문을해야 할 수도 있지만, 이것은 내가 해석 할 때 질문에 대답합니다.

이건 어때?

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

기술적으로, 반드시 최신 태그를 얻을 수는 없지만 태그가 지정된 최신 커밋은 찾고자하는 것입니다.

git describe --tags

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

"가장 최근"은 git 측면에서 두 가지 의미를 가질 수 있습니다.

"어떤 태그가 생성 날짜를 최신 날짜에 가지고있다"는 것을 의미 할 수 있으며, 여기서 대부분의 답변은 그 질문에 대한 것입니다. 질문의 관점에서, 당신은 태그를 반환하고 싶을 것입니다 c.

또는 당신은 "어떤 태그가 어떤 태그가 개발 이력에서 가장 가까운 지점에 가장 가까운지라도", 보통 당신이있는 지점을 의미 할 수 있습니다. HEAD. 귀하의 질문에서 이것은 태그를 반환합니다 a.

물론 이것은 다를 수 있습니다.

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

개발자가 태그를 상상해보십시오 Z ~처럼 v0.2 월요일에 태그를 붙였습니다 Q ~처럼 v0.1 화요일에. v0.1 가장 최근의 것이지만 v0.2 경로가 머리에 가까워지는 지점에서 시작된다는 의미에서 개발 이력이 더 가깝습니다.

나는 당신이 보통이 두 번째 대답을 원한다고 생각합니다. 사용하여 찾을 수 있습니다 git log v0.2..HEAD 각 태그에 대해 등. 이것은 경로가 끝나기 때문에 머리에 커밋 수를 제공합니다. v0.2 경로에서 분기 한 다음 머리가 이어졌습니다.

다음은이 점검을 실행하는 모든 태그를 반복하여이를 수행 한 다음 태그 경로가 분기 된 이후 헤드에 커밋이 적은 태그를 인쇄하여이를 수행하는 파이썬 스크립트입니다.

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

git describe 머리에서 역사상 경로에있는 첫 번째 태그를 찾기 위해 (예 :) 헤드에서 다시 추적한다는 점에서 약간 다른 일을합니다. git 용어로 git describe 헤드에서 "도달 할 수있는"태그를 찾습니다. 따라서와 같은 태그를 찾지 못할 것입니다 v0.2 그것은 머리에서 뒤로 돌아가는 것이 아니라 거기에서 분기 된 길입니다.

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

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

마지막 태그가 둘 이상이 필요한 경우

(git 설명-태그는 때때로 잘못된 해시를 제공하고, 왜 그런지 모르겠지만, 나에게는-max-count 2가 작동하지 않습니다)

이것은 역 순서대로 최신 2 개의 태그 이름으로 목록을 얻는 방법입니다. GIT 1.8.4에서 완벽하게 작동합니다. 이전 버전의 git (예 : 1.7.*)의 경우 "태그 :"출력의 문자열이 없습니다.

2 개 이상의 최신 태그를 원한다면 -이 "SED 2Q"를 "SED 5Q"또는 필요한 모든 것으로 변경하십시오.

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

무엇인가요 잘못된 모든 제안과 함께 (제외 매튜 브렛 설명,이 답변 게시물의 최신)?

jQuery git 이력에서 다른 명령을 내릴 때 역사의 다른 지점 그리고 결과를 확인하십시오 시각적 태깅 기록 표현 (나 했다 그렇기 때문에이 게시물이 보입니다) :

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

오늘날 많은 프로젝트가 릴리스를 수행합니다 (그리고 태깅) 메인 라인에서 별도의 지점에서.

거기 있습니다 강한 이유 이것을 위해. 잘 확립 된 JS/CSS 프로젝트를 살펴보십시오. 사용자 규칙의 경우 DVC에서 이진/미니딩 릴리스 파일을 보유합니다. 당연히 프로젝트 관리자로서 메인 라인을 쓰레기를 쓰고 싶지 않습니다. 차이 쓸모없는 이진 덩어리를 가진 역사 및 빌드 아티팩트 공연 메인 라인 밖.

git은 선형 이력이 아니라 DAG를 사용하기 때문에 거리 메트릭을 정의하기 어렵습니다 그래서 우리는 말할 수 있습니다 - 오, 그 rev는 내 HEAD!

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

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

현재 유용성 감소로 태그와 개정 사이의 거리에 대한 4 가지 합리적인 정의가 있습니다.

  • 가장 짧은 경로의 길이 ~에서 HEAD 에게 기지를 병합하십시오 태그로
  • 데이트기지를 병합하십시오 ~ 사이 HEAD 그리고 태그
  • Revs의 수 머리에서 도달 할 수는 있지만 태그에서는 도달 할 수 없습니다
  • 데이트 상관없이 태그 기지를 병합하십시오

계산 방법을 모르겠습니다 가장 짧은 경로의 길이.

이에 따라 태그를 정렬합니다 데이트기지를 병합하십시오 ~ 사이 HEAD 그리고 태그 :

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

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

이에 따라 태그를 정렬합니다 Revs의 수 머리에서 도달 할 수는 있지만 태그에서는 도달 할 수 없습니다.

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

프로젝트 이력이 커밋에 이상한 날짜가 있다면 (Rebase 또는 다른 역사 재 작성로 인해 또는 일부 바보는 BIOS 배터리 또는 역사에서하는 다른 마법을 대체하는 것을 잊어 버리기) 위의 스크립트를 사용합니다.

마지막 옵션을 위해 (데이트 상관없이 태그 기지를 병합하십시오) 날짜 사용으로 정렬 된 태그 목록을 얻으려면 :

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

알려진 현재 개정 날짜 사용 :

$ git log --max-count=1

주목하십시오 git describe --tags 자체 사례에 대한 사용량이 있지만 찾기위한 것이 아닙니다. 프로젝트 이력에서 인간이 가장 가까운 태그.

노트 모든 개정에서 위의 레시피를 사용할 수 있습니다. HEAD 당신이 원하는 것과 함께!

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 태그"를 실행하면 모든 태그가 나열됩니다. 패턴은 쉘 와일드 카드입니다 (즉, fnmatch (3)를 사용하여 일치). 여러 패턴이 주어질 수 있습니다. 일치하면 태그가 표시됩니다.


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

업데이트

와 함께 git tag --help, 대한 sort 논쟁. 그것은 사용할 것입니다 lexicorgraphic order 기본적으로 if tag.sort 속성이 존재하지 않습니다.

순서 기본값을 태그에 대해 구성된 값으로 정렬하십시오. git-config (1)를 참조하십시오.

Google 후 누군가가 말했다 GIT 2.8.0 지원 구문 다음.

git tag --sort=committerdate

git describe --abbrev=0 --tags

최신 태그가 표시되지 않으면 실행하기 전에 원점을 가져 오십시오.

git remote update

마지막 두 태그가 필요한 경우 다음은 저에게 작동합니다 (예 : 현재 태그와 이전 태그 사이에 변경 로그를 생성하기 위해). 최신 태그가 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 마법사가 아니기 때문에 더 개선 될 수 있다고 확신합니다. 또한 커밋 역사가 앞으로 나아갈 경우가 끊어 질 것이라고 생각합니다. 누군가를 돕는 경우를 대비하여 공유하고 있습니다.

내 첫 생각은 당신이 사용할 수 있다는 것입니다 git rev-list HEAD, 모든 Revs를 역순 순서로 나열합니다. git tag --contains. 당신이 어디에 참조를 찾을 때 git tag --contains 비어 있지 않은 목록을 생성하면 가장 최근의 태그를 찾았습니다.

특정 분기에 적용된 마지막 태그를 찾으려면 다음을 시도 할 수 있습니다.

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

이것은 오래된 실이지만 많은 사람들이 OP의 질문에 가장 간단하고 가장 쉽고 가장 정답을 놓치고있는 것 같습니다. 현재 지점, 너는 사용한다 git describe HEAD. 완료.

편집 : 유효한 Refname, 심지어 리모컨도 제공 할 수도 있습니다. 즉, git describe origin/master Origin/Master에서 도달 할 수있는 최신 태그를 알려줍니다.

현재 지점에서 접두사를 접두사 한 현재 분기/태그 이름에서만 최신 태그를 얻으려면 다음을 실행해야했습니다.

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}'

질문에 따라 질문에 대해

현재 지점에서 최신 태그 이름을 얻는 방법

당신은 원합니다

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

--first-parent 말한다 git log 병합 된 역사를 자세히 설명하지 말고 --pretty=%d 커밋에 대한 장식의 날짜, 즉 로컬 이름 만 표시하라고 말합니다. grep -m1 "하나만 일치"라고 말하면 가장 많이 얻은 태그 만 얻을 수 있습니다.

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

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top