Programing

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

lottogame 2020. 2. 26. 07:38
반응형

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


저장소에 주석이 달린 태그가 많이 있으며 태그를 가리키는 커밋을 해결하고 싶습니다. 태그와 커밋 SHA를 나열하는 명령이 있습니까? 태그를 확인하고 HEAD를 보면 너무 힘들 것 같습니다.

최신 정보

내가 실제로 원하는 것은 태그로 이어지는 역사를 보는 것만 git log <tagname>으로 충분하다는 반응을 겪은 후에 깨달았습니다 .

답변으로 표시된 답변은 태그 및 커밋 목록을 얻는 데 유용합니다. 약간의 셸 해커를 사용하면 SHA + 커밋 메시지로 변환 할 수 있다고 확신합니다.


이 작업을 수행하는 한 가지 방법은입니다 git rev-list. 다음은 태그가 가리키는 커밋을 출력합니다.

$ git rev-list -n 1 $TAG

~/.gitconfig많이 사용 하면 별칭으로 추가 할 수 있습니다 .

[alias]
  tagcommit = rev-list -n 1

그런 다음 호출하십시오.

$ git tagcommit $TAG

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>

그러나 커밋 차이도 덤프합니다. 해당 diff를 생략하려면을 사용하십시오 git log -1 <tag>. (@DolphinDream 및 @demisx 감사합니다!)


내 저장소 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(자세한 내용은 설명서를 참조하십시오).


에서 이고르 Zevaka :

요약

거의 똑같이 수용 가능하지만 다른 답변은 약 4 가지이므로 태그를 스키닝하는 모든 다른 방법을 요약합니다.

  1. git rev-list -1 $TAG( 답변 ). git rev-list출력까지 이어질 커밋 $TAG유사하기 git log만 커밋의 SHA1을 도시. -1(가)이를 가리키는 커밋에 출력을 제한합니다.

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

  3. git show-ref $TAG( answer )은 SHA1과 함께 태그 및 경로를 표시합니다.

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

  5. git rev-parse --verify $TAG^{commit}( answer )는 주석이 달린 태그와 주석이없는 태그의 SHA1을 표시합니다. Windows에서는 git rev-parse --verify %TAG%^^^^{commit}(모자 4 개)를 사용하십시오.

  6. cat .git/refs/tags/*또는 태그가 로컬인지 또는 원격에서 가져 왔는지 여부에 따라 cat .git/packed-refs( answer ).


이건 어때:

git log -1 $TAGNAME

또는

git log -1 origin/$TAGNAME

태그가 참조하는 커밋의 샤 / 해시를 얻으려면 (태그의 샤가 아님) :

git rev-list -1 <tag>


또한 "올바른"방법을 알고 싶지만 그 동안에는 다음과 같이 할 수 있습니다.

git show mytag | head -1    

이것은 꽤 오래되었지만 커밋으로 태그를 나열하기 위해 방금 찾은 멋진 기능을 지적 할 것이라고 생각했습니다.

git log --decorate=full

커밋에서 종료 / 시작되는 브랜치와 커밋에 대한 태그가 표시됩니다.


태그가 사용하는 위치를보다 이해하기 쉽게 이해할 수 있습니다.

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

를 통해 원하는 태그로 스크롤합니다 /.

더 컴팩트 한 뷰 ( --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

이것은 현재 SHA1 해시를 얻을 것입니다

약식 커밋 해시

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

커밋 해시

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

에서 자식 메일 링리스트 , 여기에 주석 태그 자동 역 참조와 태그를 해시를 커밋의 목록을 얻을 수있는 방법입니다 :

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

나는 또한 올바른 방법 을 알고 싶습니다 .하지만 항상 들여다 볼 수 있습니다.

$ cat .git/packed-refs 

또는:

$ cat .git/refs/tags/*

SOMETAG 태그 (태그, 날짜 등)의 세부 정보를 보려면 커밋의 해시와 커밋에 대한 약간의 정보가 있지만 전체 diff가없는 경우

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) .....

이것은 파일 이름을 표시하지 않지만 적어도 저장소의 느낌을 얻습니다.

cat .git/refs/tags/*

해당 디렉토리의 각 파일에는 커밋을 가리키는 커밋 SHA가 포함됩니다.


따라서 릴리스 폴더가 많이 있습니다.이 폴더는 몇 가지 다른 저장소 중 하나에서 체크 아웃 될 수 있으며 dev, qa 또는 master 브랜치이거나 프로덕션 릴리스, 태그에서 체크 아웃 될 수 있으며 태그는 주석이 달린 것인지 아닌지. 대상 폴더를보고--형식으로 답을 얻는 스크립트가 있습니다. 문제는 태그 체크 아웃에 대해 다른 버전의 git return different status '입니다.

그래서 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

아래에서 사용할 수 있으며 커밋 해시를 제공합니다.
git show -s --format=%H <tag>^{commit}

약식 커밋 해시가 필요한 경우 git show -s --format=%h <tag>^{commit}

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



반응형