sourcetip

Git에서 태그가 가리키는 커밋을 어떻게 알 수 있습니까?

fileupload 2023. 5. 8. 22:25
반응형

Git에서 태그가 가리키는 커밋을 어떻게 알 수 있습니까?

저장소에 주석이 없는 태그가 여러 개 있는데 이 태그가 가리키는 커밋이 무엇인지 확인하고 싶습니다.태그와 해당 SHA를 나열하는 명령이 있습니까?태그를 확인하고 HEAD를 보는 것은 저에게는 조금 힘든 일인 것 같습니다.

갱신하다

제가 실제로 원했던 것은 단순히 태그에 이르는 역사를 보는 것이라는 것을 제가 응답을 거친 후에 깨달았습니다.git log <tagname>충분합니다.

답변으로 표시된 답변은 제가 질문한 태그와 커밋 목록을 얻는 데 유용합니다.약간의 셸 해킹을 통해 저는 그것들을 SHA+Commit 메시지로 변환하는 것이 가능하다고 확신합니다.

이를 위한 한 가지 방법은git rev-list다음은 태그가 가리키는 커밋을 출력합니다.

$ git rev-list -n 1 $TAG

참고 이것은 주석이 달린 태그와 주석이 없는 태그 모두에서 작동합니다.

에별로추수있다니습가할에 할 수 .~/.gitconfig많이 사용하는 경우:

[alias]
  tagcommit = rev-list -n 1

그런 다음 다음 다음과 같이 부릅니다.

$ git tagcommit $TAG

가능한 함정: 로컬 체크아웃 또는 동일한 태그 이름의 분기가 있는 경우 이 솔루션은 "경고: refname 'myTag'가 모호합니다."라는 메시지를 표시할 수 있습니다.이 경우 다음과 같이 특수성을 높이십시오.

$ git rev-list -n 1 tags/$TAG

경고 이것은 주석이 없는 태그에만 적용됩니다. 따라서 일반적인 경우 https://stackoverflow.com/a/1862542/1586965 에서 작동하는 승인된 답변을 사용하는 것이 더 안전합니다.

git show-ref --tags

를 들면, 들면를예,git show-ref --abbrev=7 --tags다음과 같은 내용이 표시됩니다.

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2

그냥 사용하기git show <tag>

그러나 커밋 차이도 덤프합니다.이러한 차이를 생략하려면 다음을 사용합니다.git log -1 <tag> (@Dolphin Dream @demisx 덕니다입분과)!!)

이고르 제바카로부터:

요약

거의 동일하게 받아들여질 수 있지만 다른 답이 4개 정도 있기 때문에 태그를 제거하는 모든 다른 방법을 요약하겠습니다.

  1. git rev-list -1 $TAG(정답). git rev-list다으로이커출력다니합밋을는음지어까지 합니다.$TAG와비한과 한.git log하지만 SHA1의 커밋만 보여줍니다.-1출력을 지정하는 커밋으로 제한합니다.

  2. git show-ref --tags(답변)은 모든 태그(로컬 및 원격에서 가져온 태그)와 해당 SHA1을 표시합니다.

  3. git show-ref $TAG(정답)은 SHA1과 함께 태그와 해당 경로를 표시합니다.

  4. git rev-parse $TAG(정답)은 주석이 없는 태그의 SHA1을 표시합니다.

  5. git rev-parse --verify $TAG^{commit}(답변)은 주석이 달린 태그와 주석이 없는 태그 모두의 SHA1을 표시합니다.Windows 사용 시git rev-parse --verify %TAG%^^^^{commit}(4개의 모자)

  6. cat .git/refs/tags/*또는cat .git/packed-refs(응답) 태그가 로컬인지 원격에서 가져온 것인지 여부에 따라 달라집니다.

이 달린 태그의 , 이달태경우의그린,git show-ref TAG태그가 가리키는 커밋의 해시가 아닌 태그의 해시를 표시합니다.

git show-ref --dereference TAG추가적으로 추가된 커밋이 가리키는 것을 보여줍니다.^{}.

사용하다

git rev-parse --verify <tag>^{commit}

(이것은 주석이 달린 태그에 대해서도 커밋의 SHA-1을 반환합니다.)


git show-ref <tag>다음과 같은 경우에도 작동할 것입니다.<tag>주석이 달리지 않았습니다.그리고 항상 있습니다.git for-each-ref(자세한 내용은 설명서 참조).

이거 어때:

git log -1 $TAGNAME

OR

git log -1 origin/$TAGNAME

태그가 참조하는 커밋의 sha/hash(태그의 sha가 아님)를 가져오려면 다음을 수행합니다.

git rev-list -1 <tag>

Git-2 이후 짧은 답변

저는 이 질문이 꽤 오랫동안 여기에 있었다는 것을 알고 있습니다. 그고리 CB Bailey 의대답 100% 니합다정.git show-ref --tags --abbrev

사용하기 때문에 이것이 더 좋습니다.git tag:

git tag --list --format '%(refname:short) %(objectname:short)'

간단. 짧습니다.

칭별로 을 붙입니다.git taglist다음 명령을 사용합니다.

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"

또한 "올바른" 방법을 알고 싶지만, 그 사이에 다음과 같은 작업을 수행할 수 있습니다.

git show mytag | head -1    

--format옵션을 사용하여 태그 해시와 커밋 해시를 모두 표시하고 경량 태그와 주석이 달린 태그를 구분할 수 있습니다.

git tag --format="%(color:bold cyan)== %(refname:short) ==%(if)%(object)%(then)%0aTag Hash: %(objectname)%0aTag Date: %(taggerdate:iso-local)%0a  Commit: %(object) %0a%0a%(contents)%(else)%0a(lightweight tag)%0a  Commit: %(objectname)%(end)%0a"

다음과 유사한 출력을 제공합니다.

== b2lightweight ==
(lightweight tag)
  Commit: 0450fae4352dbbbf088419757eda32711316a02e

== c3_annotated ==
Tag Hash: 19961d8678a09a319a9d6c398c79f27cc23d610c
Tag Date: 2021-08-06 15:18:48 -0600
  Commit: 85be6e80c109ce44d78f0ca0da8e1ec53817b24c

This is my tag message.

It has multiple lines.

Another line.

alias로 를 Git 별칭정으다사글용여로하벌음있다수습으로 .git config --global -e다음을 추가합니다.

[alias]
    tag-verbose = tag --format='%(color:bold cyan)== %(refname:short) ==%(if)%(object)%(then)%0aTag Hash: %(objectname)%0aTag Date: %(taggerdate:iso-local)%0a  Commit: %(object) %0a%0a%(contents)%(else)%0a(lightweight tag)%0a  Commit: %(objectname)%(end)%0a'

별칭은 여전히 필터링을 허용합니다.

C:\playground>git tag-verbose -l *b2*
== b2lightweight ==
(lightweight tag)
  Commit: 0450fae4352dbbbf088419757eda32711316a02e

에 대한 자세한 은 를 참조하십시오.--format은 "필드 이름" 아래의 이름"하십시오.git help for-each-ref. (git help tag "git-for-each-ref", "git-for-each-ref")라고 .

비록 이것이 꽤 오래되었지만, 저는 커밋이 있는 태그를 나열하는 데 방금 발견한 멋진 기능을 지적하고 싶습니다.

git log --decorate=full

커밋에서 종료/시작할 분기와 커밋에 대한 태그를 표시합니다.

태그가 가리키는 위치를 보다 쉽게 해석할 수 있습니다.

git log --graph |git name-rev --stdin --tags |less

그런 다음 검색할 태그로 스크롤합니다./.

더 컴팩트한뷰 (다컴팩보기보한트▁((기보▁more보▁view▁compact--pretty=oneline 모든 + 모든헤드(-a) 또한 도움이 될 수 있습니다.

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

약간 무서워 보이지만, 에일리어스가 있을 수도 있습니다.~/.gitconfig필요하면.

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

파일 이름은 표시되지 않지만 저장소에 대한 느낌을 얻을 수 있습니다.

cat .git/refs/tags/*

해당 디렉터리의 각 파일에는 커밋을 가리키는 커밋 SHA가 포함되어 있습니다.

git 메일링 목록에서 주석이 달린 태그에 대한 자동 역참조가 있는 태그에 대한 커밋 해시 목록을 가져오는 방법은 다음과 같습니다.

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

도 올바른 방법을 알고 싶지만, 당신은 항상 다음 중 하나를 엿볼 수 있습니다.

$ cat .git/packed-refs 

또는:

$ cat .git/refs/tags/*

현재 SHA1 해시가 표시됩니다.

약식 커밋 해시

git show <tag> --format="%h" --> 42e646e

해시 커밋

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

태그 SOMTAG(태거, 날짜 등)의 세부 정보, 이 태그가 가리키는 커밋 해시 및 커밋에 대한 약간의 정보를 확인하고 싶지만 완전한 차이는 없습니다.

git show --name-status SOMETAG

출력 예:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....

릴리스 폴더를 많이 가지고 있는데, 이 폴더는 몇 가지 다른 저장소 중 하나에서 체크아웃할 수 있고, dev, qa 또는 master 브랜치일 수도 있고, 프로덕션 릴리스일 수도 있고, 태그에서 체크아웃할 수도 있고, 태그에 주석이 달 수도 있고, 그렇지 않을 수도 있습니다.나는 대상 폴더를 보고 - 양식으로 답을 받을 스크립트를 가지고 있습니다.문제는 다른 버전의 git이 태그 체크아웃에 대해 다른 상태를 반환한다는 것입니다.

그래서 찾았습니다.git show-ref --tags주석이 달린 태그를 제외하고 처음에 작동했습니다.그러나 -d를 추가하면 태그 목록에 태그에 대한 항목과 주석에 대한 항목이 별도로 추가되었습니다(주석 커밋은 sed로 제거한 ^{}로 식별됨).

그래서 이것이 제 대본의 핵심입니다. 원하는 모든 사람을 위한 것입니다.

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi

사용할 수 , 해시 ▁▁give▁can 커밋 해시를 제공합니다.
git show -s --format=%H <tag>^{commit}

hash가 필요한 경우에는 " " " 입니다.git show -s --format=%h <tag>^{commit}

해키해

을 구문 합니다..git/packed-refs을 형을지정으로 합니다.{tag}\t{sha}

sed -n '/ refs\/tags/ { s@\([^ ]*\) refs/tags/\(.*\)@\2\t\1@; p}' .git/packed-refs

git rev-list --no-walk [tag_name]

언급URL : https://stackoverflow.com/questions/1862423/how-to-tell-which-commit-a-tag-points-to-in-git

반응형