programing

Git의 현재 지점에서 어떻게 최신 태그 이름을 얻을 수 있습니까?

goodjava 2023. 6. 4. 22:21

Git의 현재 지점에서 어떻게 최신 태그 이름을 얻을 수 있습니까?

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

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

출력:

a
b
c

제가 각 태그의 날짜를 가져와서 비교하기 위해 스크립트를 작성해야 합니까?

가장 최근의 태그를 가져오려면(이후 출력 예)

git describe --tags --abbrev=0   # 0.1.0-dev

태그가 지정된 개체 위에 추가 커밋 수 등과 함께 가장 최근의 태그를 가져오려면 다음을 수행합니다.

git describe --tags              # 0.1.0-dev-93-g1416689

가장 최근에 주석이 달린 태그를 가져오는 방법

git describe --abbrev=0

▁you▁를 볼 수 있습니다.git describe당신이 요구하는 것과 비슷한 일을 하는 것입니다.

모든 분기에 걸쳐 최근 태그가 지정된 커밋의 태그를 출력합니다.

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

최신 태그를 가져오려면 다음 작업을 수행합니다.

git for-each-refes/debuggerdate --format='%(refname)' --count=1

물론, count 인수 또는 정렬 필드를 원하는 대로 변경할 수 있습니다.당신이 약간 다른 질문을 하려고 의도한 것처럼 보이지만, 제가 해석하는 바와 같이 이것은 질문에 대한 답입니다.

이건 어때?

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

기술적으로는 최신 태그가 필요하지 않지만, 태그가 지정된 최신 커밋이 필요할 수도 있고 그렇지 않을 수도 있습니다.

을 실행할 수 .git describe --tags $(git rev-list --tags --max-count=1)여기서 대화:최신 태그 이름을 가져오는 방법?

git describe --abbrev=0 --tags

최신 태그가 표시되지 않으면 다음을 실행하기 전에 오리진을 가져오십시오.

git remote update

describe/CD를 할 수 .fatal: no tags can describemessage

이는 다음과 같은 이유로 발생합니다.git describe --help:

명령은 커밋에서 연결할 수 있는 가장 최근의 태그를 찾습니다.

일반적으로 현재 분기의 트리에 속하지 않기 때문에 현재 분기가 태그에 도달할 수 있는지 여부에 관계없이 최신 태그를 레포에 지정하려면 이 명령을 사용하여 전체 레포에서 가장 최근에 생성된 태그를 제공합니다.

git tag -l --sort=-creatordate | head -n 1

"가장 최근"은 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최근의 이지만, 더최의일만지이근,만▁is▁but더최일지.v0.2개발 역사에서 HEAD에 더 가까운 지점에서 시작한다는 점에서 HEAD에 더 가깝습니다.

저는 여러분이 보통 개발 역사에서 가까운 두 번째 답을 원한다고 생각합니다.은 를사하여확수있다니습인할용▁using다를 사용하면 을 알 수 .git log v0.2..HEAD각 태그에 대한 등.가 경가다에끝이나후 HEAD대한커로 끝나는 수가 됩니다.v0.2경로에서 벗어나 HEAD가 뒤따릅니다.

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

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

git describe(신호: HEAD)에서 역추적하여 HEAD에서 역추적된 역사의 경로에 있는 첫 번째 태그를 찾는다는 점에서 약간 다른 작업을 수행합니다. 용어로, Git 어로용,git describeHEAD에서 "연결 가능" 태그를 찾습니다. 따서다음같태찾못지합다니를그와 같은 는 찾을 수 .v0.2HEAD에서 돌아오는 길이 아니라 그곳에서 갈라진 길입니다.

질문이 무엇을 요구하는지에 대한 답이 없는 이유를 잘 모르겠습니다.모든 태그(주석 없음 포함) 및 접미사 없음:

git describe --tags --abbrev=0

git describe --tags

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

git tag --sort=committerdate | tail -1
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

가 첫 번 째 문 마 지 막 태 가 옵 니 져 다 를 그 는 있 자 가 , ▁last ▁tag ▁the ▁get 다 첫 니 ▁whose 옵 가 져 ▁first ▁is ▁char0-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 orderif 적으로, 만약tag.sort속성이 존재하지 않습니다.

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

구글 다음에, 누군가 git 2.8.0이 구문을 지원한다고 말했습니다.

git tag --sort=committerdate

모든 제안(이 답변 게시물의 최신 매튜 브렛 설명 제외)에 무엇이 잘못되었습니까?

다른 기록 지점에 있을 때 jQueryGit 기록에서 다른 사람이 제공한 명령을 실행하고 시각적 태그 기록 표현으로 결과를 확인합니다(그래서 이 게시물이 표시됩니다).

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

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

여기에는 강력한 이유가 있습니다.잘 확립된 JS/CSS 프로젝트를 확인하십시오.사용자 규칙의 경우 DVCS에서 이진/최소화된 릴리스 파일을 제공합니다.당연히 프로젝트 관리자로서 당신은 쓸모없는 바이너리 블롭으로 당신의 메인라인 diff 이력을 낭비하고 메인라인 밖에서 빌드 아티팩트를 커밋하고 싶지 않습니다.

Git는 선형 이력이 아닌 DAG를 사용하기 때문에 거리 메트릭을 정의하기가 어렵기 때문에 우리는 말할 수 있습니다. 오, 그 rev가 내 것과 가장 가깝습니다.HEAD!

저는 저만의 여행을 시작합니다(안을 보세요, 저는 이 긴 게시물에 화려한 증명 이미지를 복사하지 않았습니다).

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

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

  • 에서의 최단 경로 길이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

프로젝트 기록에 커밋 날짜가 이상한 경우(기본 재배치 또는 다른 기록 재작성으로 인해) 또는 일부 바보가 BIOS 배터리 또는 기록에서 수행하는 다른 마법을 잊어버린 경우) 위 스크립트를 사용합니다.

날짜별로 정렬된 태그 목록을 가져오는 마지막 옵션( 병합 기준에 관계없이 태그의 날짜)의 경우 다음을 사용합니다.

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

현재 개정 날짜를 알려면 다음을 사용합니다.

$ git log --max-count=1

:git describe --tags자체 사례에 사용되지만 프로젝트 기록에서 인간이 예상하는 가장 가까운 태그를 찾는 데에는 사용되지 않습니다.

참고 위의 요리법은 모든 개정판에서 사용할 수 있습니다. 교체만 하면 됩니다.HEAD당신이 원하는 것으로!

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

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

(git description --가끔 잘못된 해시를 제공합니다. 이유는 모르겠지만, 저에게는 max-count 2가 작동하지 않습니다.)

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

최신 태그를 두 개 이상 원할 경우 - 이 "sed 2q"를 "sed 5q" 또는 필요한 모든 태그로 변경합니다.

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

다음은 마지막 두 태그가 필요한 경우에 사용할 수 있습니다(예: 현재 태그와 이전 태그 간의 변경 로그 생성).최신 태그가 있는 상황에서만 테스트했습니다.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 describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")

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

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

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

출력 예:

v1.0.0

Windows에서도 작동합니다.

내 첫 번째 생각은 당신이 사용할 수 있다는 것입니다.git rev-list HEAD한 것입니다.git tag --contains당신이 어디에서 심판을 찾을 때.git tag --contains비어 있지 않은 목록을 생성합니다. 가장 최근의 태그를 찾았습니다.

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

한 refname,remote도 할 수 . 즉, " " " " " " " " " " " " " " " " " " " " " " " " " " " " "git describe origin/master오리진/마스터에서 도달할 수 있는 최신 태그를 알려줍니다.

git tag --sort=-refname | awk 'match($0, /^[0-9]+\.[0-9]+\.[0-9]+$/)' | head -n 1 

이것은 시맨틱 버전과 일치하는 모든 분기에서 최신 태그를 가져옵니다.

질문하신 질문에 대해서는,

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

너는 원한다

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

--first-parent말한다git log기록에 자세한 내용을 하지 않기 위해 병된내역자않지습다니하명설합세히.--pretty=%d커밋에 대한 로컬 이름과 같은 장식만 표시하도록 합니다. grep -m1만 일치"라고 많이 검색된 수 .하나만 일치"라고 표시되므로 가장 많이 검색된 태그만 얻을 수 있습니다.

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

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 tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1

주석이 없는 태그와 주석이 달린 태그에 대한 언급은 여기에 많지 않습니다.'messages'는 주석이 달린 태그에서 작동하며 주석이 없는 태그는 무시합니다.

이것은 보기 흉하지만 요청된 작업이 수행되므로 다른 분기에서 태그를 찾을 수 없습니다(아래 예에서 master 명령에 지정된 태그가 아님).

필터링은 최적화(통합)되어야 하지만 작업에는 이 작업이 적용되는 것 같습니다.

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

비평가들은 제가 이제 이것을 사용할 것이기 때문에 환영합니다 :)

언급URL : https://stackoverflow.com/questions/1404796/how-can-i-get-the-latest-tag-name-in-current-branch-in-git