Git의 현재 지점에서 최신 태그 이름을 얻는 방법은 무엇입니까?
-
05-07-2019 - |
문제
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