2010-02-24 5 views
30

동일한 커밋에 여러 태그가있는 저장소가 있습니다. 예 :현재 커밋에서 태그를 얻는 방법

commit #3 <--- TAG1/TAG2/TAG3 

    | 

commit #2 <--- TAG4/ TAG5 

    | 

commit #1 <--- TAG6/ TAG7 

특정 커밋에 어떤 태그가 있는지 알고 싶습니다. 태그 1-7 표시

git checkout <commit 1> 
git tag --contains 

: 나는 1 커밋 확인 예를 들어, 나는 태그 6 태그 내가 시도 7.

을 좀하고 싶습니다.

git checkout <commit 1> 
git describe --tags HEAD 

태그 6 만 표시.

Git에서이 작업을 수행하는 적절한 방법은 무엇입니까?

답변

3

이 적합하지만, 아마도 도움이되지 않습니다 :

 
$ git log -n 1 --decorate --pretty=oneline 

당신은 정확하게 당신이 원하는 것을 얻을 형식 함께 놀러 수 있습니다. 윌리엄의 대답에

+0

내 정보에는 내 300 개가 넘는 다양한 제품이 있습니다. "Q"를 300 번이나 눌러보세요. – Shawn

+0

@Shawn Q 버튼을 누를 필요가 없습니다 ... –

+0

git log를 사용하여 표시 할 때마다 q 버튼을 눌러 로그 표시 모드를 종료해야합니다. 당신이 똑같 냐면 맞습니까? – Shawn

17

일부 개선 사항 :

git config --global alias.tags 'log -n1 --pretty=format:%h%d' 

출력은 다음과 같습니다 여전히 제공하기 때문에

~$ git tags 
7e5eb8f (HEAD, origin/next, origin/master, origin/HEAD, master) 
~$ git tags HEAD~6 
e923eae (tag: v1.7.0) 
+1

이것은 멋진 팁입니다 – cmcginty

+0

sed/tr/grep 명령을 추가하여이 출력을 구두점이없는 일반 목록으로 변환하려고합니다. 나는 'git log'명령어를 직접 만들 수 있지만, git config alias에 넣을 때 이스케이프 처리로 인해 죽는다. 내 로그 명령은 다음과 같습니다. git log -n1 --pretty = "format : % d"| sed "s /,/\ n/g"| grep 태그 | sed "s/tag : \ |) // g" –

+0

아래의 답변에서 자동 스크립트 (예 : 프롬프트에 태그 넣기)를 사용하는 것이 더 유용하도록 수정했습니다. –

18

어쩌면 자식이이 질문에 질문을 받았다 이후 몇 가지 옵션을 추가했다 생각하지만, 꽤 높은 Google에서, 나는이 방법이 멋지게 작동한다고 덧붙이려고 생각했다 :

HEAD을 원하는 다른 커밋 참조로 바꾸십시오. 머리는 다른 어떤 태그 및 인쇄 아무것도 포함되어있는 경우 당신이 얻을 것이다, 그래서

이 개행 문자를 인쇄 할 수는 태그로 구분 된 목록 :

TAG6 
TAG7 

을 물론 다양한 쉘 좋은 방법은 많이 있습니다 일단 당신이 그것을 가지고 출력을 포맷 할 수있는 도구는 ...

+1

완벽하게 작동합니다. 왜'-l'이 필요한지? 매뉴얼에서 args가없는'-l'은 모든 태그를 나열하는 것으로 보이는데, 이는 인수없이'tag'와 같습니다. –

+0

@cirosantilli oops, 나는 매뉴얼을 충분히주의 깊게 읽지 않았던 것 같아요. '-l'을 추가하는 것이 좋다고 생각합니다. 왜냐하면'--contains' 플래그를 잊어 버리면 새 태그를 추가하지 않게되기 때문입니다. – arcticmac

+6

이것은 잘못된 출력을줍니다. 주어진 커밋을 '포함하고있는'모든 태그를 보여줍니다. 즉, 도달 가능한 커밋에 적용된 태그도 포함됩니다. 원래의 질문은 명시 적으로 그는 이러한 오래된 태그를 원하지 않는다고 말하며 주어진 커밋에 '현재'태그만을 요구합니다. –

3

출력은 태그 (즉, 가지도 HEAD도 아닌) 만 나열하고 'tag :'라는 단어를 제거하는 @ JoshLee의 답변이 상세히 설명되어 있습니다. 장식 구두점. 이것은 (예 : 프롬프트에 넣어) 현재 태그를 찾을 필요가있는 무언가를 스크립팅하는 경우 유용합니다

git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g" 

예 출력 :

$ git log -n 1 --decorate=short 
commit a9313...c7f2 (HEAD, tag: v1.0.1, tag: uat, mybranch) 
... 
$ git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g" 
v1.0.1 
uat 
3

이 HEAD의 커밋 ID를 표시합니다, 뿐만 아니라 지점이나 정확히 HEAD에있는 모든 태그도 포함됩니다.

git reflog --decorate -1 

샘플 출력 : 완료

484c27b (HEAD, tag: deployment-2014-07-30-2359, master, origin/master) [email protected]{0}: 484c27b878ca5ab45185267f4a6b56f8f8d39892: updating HEAD 
55

(치로 Santili 답변 덕분에), 자식 태그는가하는 옵션에 --points이-정확히 숀 요구하고 무엇을 가지고있다.조나단 하틀리가 자식 태그의 --contains 자신의 의견에 명시된 바와 같이

git tag -l --points-at HEAD 

또한 앞으로에 넣어 태그를 나열하는 효과가없는 커밋.

+0

여기가 가장 좋은 대답입니다. 복잡한 명령 줄은 필요 없지만 태그 이름 만 제공합니다. –

+0

정확히 내가 필요한 것, 감사합니다. –

관련 문제