답변:
git describe
요청한 내용에 가까운 것을 수행하는을 살펴볼 수 있습니다 .
--abbrev=0
는 가장 가까운 반환해야 주석 태그
git describe --exact-match --abbrev=0
git describe --tags
그리고 github 릴리스 페이지의 마지막 태그 비교
가장 최근의 태그를 얻으려면 :
git describe --tags
가장 최근에 주석이 달린 태그 를 얻으려면 :
git describe --abbrev=0
git describe
나와있는 것처럼 : --abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
모든 브랜치에서 최근 태그가 지정된 커밋의 태그를 출력합니다
git describe --tags $(git rev-list --tags --max-count=1)
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-pursell
가장 최근의 태그를 얻으려면 다음을 수행하십시오.
$ git for-each-ref 심판 / 태그 --sort = -taggerdate --format = '% (refname)'--count = 1
물론 count 인수 또는 정렬 필드를 원하는대로 변경할 수 있습니다. 약간 다른 질문을했을 수도 있지만 해석 할 때 질문에 대한 답변이됩니다.
--sort=-authordate
와 --sort=authordate
.
--sort=-taggerdate
입니다. 태그의 경우 authordate
와 committerdate
빈 (정렬 키와 그렇게 쓸모가) 있습니다.
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
더 낫다 :)
--points-at=$SHA
커밋 해시 태그를 제공합니다.
이건 어때요?
TAG=$(git describe $(git rev-list --tags --max-count=1))
기술적으로, 반드시 최신 태그를 얻을 필요는 없지만 원하는 태그가있는 최신 커밋은 필요하지 않을 수도 있습니다.
--tags=<pattern>
에서 사용할 수 있습니다 rev-list
. 예를 들어, 마지막 버전 태그git describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
실행할 수 있습니다 : git describe --tags $(git rev-list --tags --max-count=1)
여기에서 이야기 : 최신 태그 이름을 얻는 방법?
git describe ...
것이 이전 태그를 반환 하는지 확실하지
--abbrev=0
답변 중 일부를 시도 하고 원하는 태그의 일부를 잘라 냈습니다.
"가장 최근"은 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.2
HEAD에 더 가까운 지점에서 시작한다는 점에서 HEAD에 대한 개발 기록이 더 가깝습니다.
나는 일반적으로 개발 역사에서 더 가까운 두 번째 대답을 원한다고 생각합니다. git log v0.2..HEAD
각 태그에 대해 etc를 사용하여 찾을 수 있습니다 . 경로에서 끝나는 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에서 되돌아 오는 경로가 아닌 다른 태그를 찾을 수 있습니다.
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"또는 필요한 항목으로 변경하십시오.
그런 다음 모든 태그 이름을 변수 등으로 쉽게 구문 분석 할 수 있습니다.
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
여기에서 더 나아가서 : in %D
은 주변 ()
문자 를 제외하고 sed
5q로 시작 하는 s는 5 앞에 4 줄을 남기고 'tag :`와 첫 번째', '사이의 모든 문자를 인쇄합니다. 태그 안에 쉼표를 사용하지 않는다고 가정하면 완벽하게 작동합니다.
모든 제안에서 무엇이 잘못 되었습니까 ( 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
$ 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
. 원하는 것으로 바꾸십시오 !
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
git tag --sort=committerdate | tail -1
다음은 마지막 두 태그가 필요한 경우 (예 : 현재 태그와 이전 태그 사이에 변경 로그를 생성하기 위해) 작동합니다. 최신 태그가 인 상황에서만 테스트했습니다 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 for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
이를 사용하여 설정에서 버전 번호를 설정합니다.
출력 예 :
v1.0.0
Windows에서도 작동합니다.
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
:) 건너 뛰면 --points-at=HEAD
작동합니다. 마지막 스위치를 사용하면 아무것도 반환 HEAD
되지 않습니다.
HEAD
. 왜냐하면 귀하의 태그가 없기 때문 입니다.
이것은 오래된 스레드이지만 많은 사람들이 OP의 질문에 대한 가장 간단하고 쉽고 가장 정확한 답변을 누락 한 것 같습니다 : 현재 분기 의 최신 태그를 얻으려면 을 사용하십시오 git describe HEAD
. 끝난.
편집 : 당신은 또한 유효한 참조 이름을 제공 할 수 있습니다, 심지어 리모컨; 즉, git describe origin/master
출발지 / 마스터로부터 도달 할 수있는 최신 태그를 알려줍니다.
for-each-ref
명령 ( stackoverflow.com/a/5261470/515973 )과의 조합 rev-list
과 describe
( stackoverflow.com/a/7979255/515973 )
git describe branchname --tags
분기에서 최신 태그를 얻는 데
현재 분기가 앞에 붙는 현재 분기 / 태그 이름에서만 최신 태그를 얻으려면 다음을 실행해야했습니다.
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}'
주석이 달린 태그와 주석이 달린 태그에 대해서는 언급하지 않았습니다. '설명'은 주석이 달린 태그에서 작동하며 주석이없는 태그는 무시합니다.
이것은 추악하지만 요청 된 작업을 수행하며 다른 분기에서 태그를 찾지 못합니다 (아래 예의 master : 명령에 지정된 태그가 아님).
필터링은 최적화 (통합)되어야하지만 다시 한 번 작업으로 보입니다.
git log --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1
내가 이것을 사용하려고 지금 비평가는 환영합니다 :)